[SQL SERVER][Memo]淺談SQL Server如何處理查詢陳述句

[SQL SERVER][Memo]淺談SQL Server如何處理查詢陳述句

個人認為瞭解SQL Server如何處理查詢陳述句是有必要的,

雖然現階段有很多查詢優化工具,可讓DBA簡單的透過圖形化介面進行SQL Tunning,

但優化工具結果往往只能當做參考,有時套用後,效能沒有改善反而變更差,

最近在處理SQL Tunning時,發現自己有點綁手綁腳,所以這篇就來筆記並加強自己印象。

 

SQL Server 處理單一查詢 Statement基本步驟如下:

當一句查詢 Statement到達SQL Server時,由於查詢陳述句並非程序性,

它無法提供資料庫應該用什麼樣的正確步驟來擷取所需的資料,這時就會透過剖析器掃描分析TSQL語法並轉換為查詢樹,

再藉由查詢最佳化程式(Query Optimizer)根據查詢最佳化統計資料判斷各種方式、估計成本 (CBO為基礎的最佳化工具,以估計檔案I/O和使用CPU為主) ,

最後會選擇最低且具合理的資源成本以及傳回結果速度最快的執行計畫(下圖為SQL Server 處理查詢陳述句過程)。

 

1.剖析器會先剖析查詢陳述句,並將其分成數個邏輯單位,如關鍵字、運算式、運算子和識別碼(建立剖析樹)。

2.檢查和驗證陳述句中相關物件正確性。

3.將查詢樹交給查詢最佳化程式。

4.查詢最佳化程式建立並快取執行計畫,並由關聯式引擎執行執行該計畫且要求儲存引擎回傳所需資料。

5.關聯式引擎處理從儲存引擎回傳的資料,並將其包裝成結果集所定義的格式,然後將結果集傳回給用戶端。

 

image