針對這種情況,人工智能自動SQL優化工具應運而生。現在我就向大家介紹這樣一款工具:SQLTuning for SQL Server。
1. SQL Tuning 簡介
SQL Turning是Quest公司出品的Quest Central軟件中的一個工具。
QuestCentral(圖1)是一款集成化、圖形化、跨平台的數據庫管理解決方案,可以同時管理Oracle、DB2 和 SQL server 數據庫。它包含了如下的多個工具:
數據庫管理(DBA)
數據庫監控(Monitoring Pack)
數據庫診斷 (Spotlight Diagnostics)
數據庫分析 (Database Analysis)
SQL優化 (SQL Tuning)
空間管理 (Space Management)
壓力測試 (Load Generator)
數據生成 (Data Generator)
PL/SQL 開發 (TOAD)
專家建議 (Knowledge Expert)
今天,我們只介紹其中的SQL優化(SQL Tuning for SQL Server) 的使用方法。
圖1 quest central界面
2. 使用SQL Tuning 優化SQL
下面我們用SQLServer自帶的Northwind數據庫為例,幫助大家了解如何使用SQLTuning優化SQL。
(1)建立連接。
在QuestCentral主界面上的“Database”樹上選擇“SQLServer”,然後在下方出現的“Tools”框中選擇“SQLTuning”選項,打開“Lanch SQL Tuning for SQL ServerConnections”對話框(圖2)。我們在這裡建立數據庫服務器的連接,以後的分析工作都會在它上面完成。
圖2 “建立連接”對話框
雙擊“NewConnection”圖標,在彈出窗口中輸入數據庫的信息,單擊“OK”,然後單擊“Connect”即可。
(2)分析原始SQL語句 。
在打開窗口的“OriangalSQL”文本框內輸入需要分析的原始SQL語句,代碼如下:
/*查詢賣出價個不同的同一貨物名稱*/ select DISTINCT c.CompanyName,p.ProductName from [Order Details] od1,[Order Details] od2 , Orders o1 , Orderso2,Customers c, Products p where od1.UnitPrice<>od2.UnitPrice andod1.ProductID=od2.ProductID and od1.OrderID=o1.OrderID and od2.OrderID=o2.OrderID and o1.CustomerID=o2.CustomerID and o1.CustomerID=C.CustomerID
首先在界面左上方選擇數據庫,然後點擊工具欄上的“Execute”按鈕,執行原始的SQL語句,SQLTuning會自動分析SQL的執行計劃,並把分析結果顯示到界面上(圖3)。
圖3 分析原始SQL語句
(3)優化SQL。
現在我們點擊工具欄上的“Optimize Statement”按鈕,讓SQLTuning開始優化SQL,完成後,可以看到SQLTuning產生了34條與原始SQL等價的優化方案(圖4)。
圖4 SQL優化方案
(4)獲得最優SQL。
接下來,我們來執行上面產生的優化方案,以選出性能最佳的等效SQL語句。在列表中選擇需要執行的優化方案(默認已全部選中),然後點擊工具欄上的“Execute”按鈕旁邊的下拉菜單,選擇“ExecuteSelected”。等到所有SQL運行完成後,點擊界面左方的“TuningResolution”按鈕,可以看到最優的SQL已經出來啦,運行時間竟然可以提高52%!(圖5)
圖5 “Tuning Resolution”界面
(5)學習書寫專家級的SQL語句。
通過上面的步驟,我們已經可以實現自動優化SQL語句,但更重要的是,我們還可以學習如何書寫這樣高性能的SQL語句。點擊界面左方的“CompareScenarios”按鈕,我們可以比較優化方案和原始SQL中的任意2條SQL語句,SQLTuning會將它們之間的不同之處以不同顏色表示出來,還可以在下方的“執行計劃”中,通過比較兩條SQL語句的執行計劃的不同,來了解其中的差異(圖6)。
圖6 “Compare Scenarios”界面
3.小結
SQLTuning等人工智能自動SQL優化工具的出現,為我們節省出大量的時間和精力。借助這些工具的幫助,書寫專家級的SQL語句將不再是難事。
在數據庫應用系統中編寫可執行的SQL語句可以有多種方式實現,但哪一條是最佳方案卻難以確定。為了解決這一問題,有必要對SQL實施優化。簡單地說,SQL語句的優化就是將性能低下的SQL語句轉換成達到同樣目的的性能更好的SQL語句。
優化SQL語句的原因
數據庫系統的生命周期可以分成: 設計、開發和成品三個階段。在設計階段進行優化的成本最低,收益最大。在成品階段進行優化的成本最高,收益最小。如果將一個數據庫系統比喻成一座樓房,在樓房建好後進行矯正往往成本很高而收效很小(甚至可能根本無法矯正),而在樓房設計、生產階段控制好每塊磚瓦的質量就能達到花費小而見效高的目的。
為了獲得最大效益,人們常需要對數據庫進行優化。數據庫的優化通常可以通過對網絡、硬件、操作系統、數據庫參數和應用程序的優化來進行。根據統計,對網絡、硬件、操作系統、數據庫參數進行優化所獲得的性能提升全部加起來只占數據庫應用系統性能提升的40%左右,其余60%的系統性能提升全部來自對應用程序的優化。許多優化專家甚至認為對應用程序的優化可以得到80%的系統性能提升。因此可以肯定,通過優化應用程序來對數據庫系統進行優化能獲得更大的收益。
對應用程序的優化通常可分為兩個方面: 源代碼的優化和SQL語句的優化。由於涉及到對程序邏輯的改變,源代碼的優化在時間成本和風險上代價很高(尤其是對正在使用中的系統進行優化) 。另一方面,源代碼的優化對數據庫系統性能的提升收效有限,因為應用程序對數據庫的操作最終要表現為SQL語句對數據庫的操作。
對SQL語句進行優化有以下一些直接原因:
1. SQL語句是對數據庫(數據) 進行操作的惟一途徑,應用程序的執行最終要歸結為SQL語句的執行,SQL語句的效率對數據庫系統的性能起到了決定性的作用。
2. SQL語句消耗了70%~90%的數據庫資源。
3. SQL語句獨立於程序設計邏輯,對SQL語句進行優化不會影響程序邏輯,相對於對程序源代碼的優化,對SQL語句的優化在時間成本和風險上的代價都很低。
4. SQL語句可以有不同的寫法,不同的寫法在性能上的差異可能很大。
5. SQL語句易學,難精通。SQL語句的性能往往同實際運行系統的數據庫結構、記錄數量等有關,不存在普遍適用的規律來提升性能。
傳統的優化方法
SQL程序人員在傳統上采用手工重寫來對SQL語句進行優化。這主要依靠DBA或資深程序員對SQL語句執行計劃的分析,依靠經驗,嘗試重寫SQL語句,然後對結果和性能進行比較以試圖找到性能較佳的SQL語句。這種做法存在著以下不足:
1. 無法找出SQL語句的所有可能寫法。很可能花費了大量的時間也無法找到性能較佳的SQL語句。即便找到了某個性能較佳的SQL語句也無法知道是否存在性能更好的寫法。
2. 非常依賴於人的經驗,經驗的多寡往往決定了優化後SQL語句的性能。
3. 非常耗時間。重寫-->校驗正確性-->比較性能,這一循環過程需要大量的時間。
根據傳統的SQL優化工具的功能,人們一般將優化工具分為以下三代產品:
第一代的SQL優化工具是執行計劃分析工具。這類工具對輸入的SQL語句從數據庫提取執行計劃,並解釋執行計劃中關鍵字的含義。
第二代的SQL優化工具只能提供增加索引的建議,它通過對輸入的SQL語句的執行計劃的分析來產生是否要增加索引的建議。這類工具存在著致命的缺點——只分析了一條SQL語句就得出增加某個索引的結論,根本不理會(實際上也無法評估到)增加的索引對整體數據庫系統性能的影響。
......余下全文>>
查詢速度慢的原因很多,常見如下幾種:
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷)
2、I/O吞吐量小,形成了瓶頸效應。
3、沒有創建計算列導致查詢不優化。
4、內存不足
5、網絡速度慢
6、查詢出的數據量過大(可以采用多次查詢,其他的方法降低數據量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷)
8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優化