程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL語句的自動優化

SQL語句的自動優化

編輯:關於SqlServer


在數據庫應用系統中編寫可執行的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語句就得出增加某個索引的結論,根本不理會(實際上也無法評估到)增加的索引對整體數據庫系統性能的影響。



第三代工具是利用人工智能實現自動SQL優化。

人工智能自動SQL優化

隨著人工智能技術的發展和在數據庫優化領域應用的深入,在20世紀90年代末優化技術取得了突破性的進展,出現了人工智能自動SQL優化。人工智能自動SQL優化的本質就是借助人工智能技術,自動對SQL語句進行重寫,找到性能最好的等效SQL語句。LECCO SQL Expert就采用了這種人工智能技術,其SQL Expert支持Oracle、Sybase、MS SQL Server和IBM DB2數據庫平台。其突出特點是自動優化SQL語句。除此以外,還可以以人工智能知識庫“反饋式搜索引擎”來重寫SQL語句,並找出所有等效的SQL語句及可能的執行計劃,通過測試運行為應用程序和數據庫自動找到性能最好的SQL語句,提供微秒級的計時; 能夠優化Web應用程序和有大量用戶的在線事務處理中運行時間很短的SQL語句; 能通過比較源SQL和待選SQL的不同之處,為開發人員提供“邊做邊學式訓練”,迅速提高開發人員的SQL編程技能等等。

該工具針對數據庫應用的開發和維護階段提供了數個特別的模塊:SQL語法優化器、PL/SQL集成化開發調試環境(IDE)、掃描器、數據庫監視器等。其核心模塊之一“SQL 語法優化器”的工作原理大致如下:輸入一條源SQL語句,“人工智能反饋式搜索引擎”對輸入的SQL語句結合檢測到的數據庫結構和索引進行重寫,產生N條等效的SQL語句輸出,產生的N條等效SQL語句再送入“人工智能反饋式搜索引擎”進行重寫,直至無法產生新的輸出或搜索限額滿,接下來對輸出的SQL語句進行過濾,選出具有不同執行計劃的SQL語句(不同的執行計劃意味著不同的執行效率),最後,對得到的SQL語句進行批量測試,找出性能最好的SQL語句(參見下圖)。

圖 人工智能自動SQL優化示意圖

LECCO SQL Expert不僅能夠找到最佳的SQL語句,它所提供的“邊做邊學式訓練”還能夠教會開發人員和數據庫管理員如何寫出性能最好的SQL語句。LECCO SQL Expert的SQL語句自動優化功能使SQL的優化變得極其簡單,只要能夠寫出SQL語句,它就能幫開發人員找到最好性能的寫法。

小 結

SQL語句是數據庫應用中一個非常關鍵的部分,它執行性能的高低直接影響著應用程序的運行效率。正因為如此,人們在SQL語句的優化上投入了很大的精力,出現了許多SQL語句優化工具。隨著人工智能等相關技術的日益成熟, 肯定還會有更多更好的工具出現,這將會給開發人員提供更多的幫助。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved