複製鏈接
請複製以下鏈接發送給好友

查詢優化器

鎖定
查詢優化器是SQL Server針對用户的請求進行內部優化,生成(或重用)執行計劃並傳輸給存儲引擎來操作數據,最終返回結果給用户的組件。查詢優化器是關係型數據庫管理系統的核心之一,決定對特定的查詢使用哪些索引、哪些關聯算法、從而使其高效運行,它是優化器中最重要的組件之一。
中文名
查詢優化器
外文名
query optimizer
簡    稱
優化器
類    型
基於語法和基於成本的優化器
地    位
是關係型數據庫管理系統核心之一
應用學科
數據庫管理

目錄

查詢優化器定義

查詢優化器(簡稱優化器)是負責生成 SQL 語句的有效執行計劃的 SQL Server 數據庫引擎組件,具體地説,查詢優化器是SQL Server針對用户的請求進行內部優化,生成(或重用)執行計劃並傳輸給存儲引擎來操作數據,最終返回結果給用户的組件。 [1]  它是關係型數據庫管理系統的核心之一,決定對特定的查詢使用哪些索引、哪些關聯算法、從而使其高效運行,它是優化器中最重要的組件之一。 [1] 

查詢優化器類型

基於語法
基於語法的查詢優化器完全根據查詢的準確語法來選擇規劃,這是建立在查詢中子句的順序的基礎上的。一旦選定了一個規劃,該查詢就將完全按照該計劃執行,並且執行的順序就是子句的順序。基於語法的查詢不需要保存分佈統計。隨着表的分佈的改變,一段時間後,所選定的查詢規劃就可能不再有那麼好的性能。
基於成本
基於成本的查詢優化器分析數據和索引列的分佈統計,從而根據完成查詢的成本決定效率最高的執行規定。成本是根據資源利用率來測量的。響應時間也是影響成本的一個因素。SQL Server尋求能夠以最快的速度把結果返回給用户並且不會導致其他方面性能下降的途徑。因此,在具有多個處理器的系統中,查詢處理器可能選擇這樣的執行規劃,雖然它的總體成本比其他的執行規劃要大一些,但是它可以更快地把結果返回給用户,並且不會降低其他方面的性能。
分佈統計是從索引和表中的數據列的分佈信息彙總出來的,並且由SQL Server自動在建立了索引的列上創建和維護。也可以選擇把統計建立在沒有索引的列上。基於成本的優化器將分析各種查詢規劃,並且作為其評價標準的信息,包括被請求的數據量以及處理過程花費的時間,具體表現在對CPU和內存的影響以及I/O操作的次數。 [2] 

查詢優化器工作過程

在提交查詢之後,執行以下幾個步驟將原始查詢轉換為查詢優化器能夠解釋的格式。
解析過程
解析是分析SQL語句並將其轉換成可被編譯的數據結構的過程,解析過程還包括確認SQL語句語法的有效性。解析過程對引入的查詢進行語法檢查,並將該語法分解成多個關係數據庫引擎能夠響應的部分。本步驟的輸出是解析後的查詢樹。 [3] 
解析並不包括諸如檢查表名和列名的有效性這樣的操作,這些操作將在規範化過程中處理。規範化過程主要確定SQL語句所引用的對象的特徵,並檢查請求語義是否正確。例如,嘗試執行一個表在語義上是不合邏輯的。 [3] 
標準化過程
標準化過程把查詢轉換成優化過程可以使用的格式,檢測到的任何冗餘語法的子句都要被移除。如果有可能,也將子查詢標準化。本步驟的輸出是一個標準化的查詢樹。 [3] 
查詢優化
從幾個可能的計劃中選擇一個執行計劃的過程稱為優化。這個階段包括很多步驟,不過,對執行計劃的開銷影響最大的步驟只有查詢分析、索引選擇和聯接選擇。 [3] 
編譯
這個階段是把查詢編譯成可執行的代碼 [3] 
數據庫訪問例程
查詢優化器通過掃描表或使用可用的索引,來確定訪問數據的最好方法,然後會應用該方法。 [3] 

查詢優化器關係

查詢優化器使用表和索引的分佈統計來決定查詢的效率最高的執行規劃。查詢優化器使用分佈統計來估計能夠滿足查詢的每一個規劃的資源消耗,例如索引或者視圖,保持當前的分佈統計是維持SQL Server的良好性能的關鍵。 [2] 
統計的更新方式有兩種:如果數據已經存在於表中,就會在第一次創建索引的時候進行更新;另外一種方式是在執行UPDATE STATISTICS命令的時候進行更新。UPDATE STATISTICS命令可以手工或者自動執行。可以把統計的更新定義為數據庫維護計劃的一部分,或者由自動更新功能來觸發。如果統計信息過時了,查詢優化器不能做出最明智的決定。如果在Query Analyzer的“Graphical ShowPlan”選項中查看每一個查詢的執行規劃,節點信息將會顯示統計是否需要被更新。 [2] 
參考資料
  • 1.    黃釗吉著 .SQL Server性能優化與管理的藝術.北京:機械工業出版社,2014:60-65
  • 2.    [美]Jenney Lynne Fields著 袁勤勇 何欣等譯.Microsoft SQL Server 2000優化指南.北京:清華大學出版社,2001:55-56
  • 3.    微軟公司著.數據庫程序設計:SQL Server2000數據庫程序設計 .北京:高等教育出版社,2007:486-490