SQL Server 執行計划分析


當一個查詢到達數據庫引擎時,SQL Server執行兩個主要的步驟來產生期望的查詢結果:

  第一步:查詢編譯,生成查詢計划。

  第二步:執行這個查詢計划。

1. 用於演示分析執行計划的查詢語句

/*
查詢返回所有來自London且發生過5個以上訂單的所有消費者的ID和訂單數
*/
USE Northwind
GO

SELECT 
	C.CustomerID
	,COUNT(O.OrderID) AS NumOrders 
FROM Customers C
	LEFT OUTER JOIN dbo.Orders O ON C.CustomerID = O.CustomerID
WHERE C.City = 'London'
GROUP BY C.CustomerID
HAVING COUNT(O.OrderID) > 5
ORDER BY NumOrders

2. 圖形化的查詢計划,如下圖:

3. 上圖中的箭頭,表示數據流。箭頭的粗細,表示傳遞數據行數的多少。鼠標放到1所在位置的線上時,可以看到對應的詳細信息。

4. 查詢引擎先對Customers表執行Index Seek(把鼠標放到Index Seek圖表上,可以看到如下提示窗口),找到第一個來自London的Customer,並且把該行數據傳遞到Nested Loops運算符。

 5.數據傳遞到Nested Loops運算符以后,激活運算符的內側運算(Compute Scalar,Stream Aggregate,Index Seek).首先執行Index Seek。根據Nested Loops的外部輸入對應的CustomerID,查詢到對應的Order.

6.上一步Index Seek查詢的結果,傳遞給Stream Aggregate運算符。在執行Stream Aggregate運算中定義了表達式[Expr1009]=Count(*),進行數據統計。

【Stream Aggregate 運算符按一列或多列對行分組,然后計算查詢返回的一個或多個聚合表達式。此運算符的輸出可供查詢中的后續運算符引用和/或返回到客戶端。Stream Aggregate 運算符要求輸入在組中按列進行排序。如果由於前面的 Sort 運算符或已排序的索引查找或掃描導致數據尚未排序,優化器將在此運算符前面使用一個 Sort 運算符。在 SHOWPLAN_ALL 語句或 SQL Server Management Studio 的圖形執行計划中,GROUP BY 謂詞中的列會列在 Argument 列中,而聚合表達式列在 Defined Values 列中。】【摘自:technet】

7.Stream Aggregate 運算符的統計結果,傳遞給Cumpute Scalar運算符,在執行Cumpute Scalar中定義了表達式[Expr1004]=CONVERT_IMPLICIT(int,[Expr1009],0);

Cumpute Scalar運算符把統計結果[Expr1004]保存到從Nested Loops外部輸入的那行數據中。

8.新組成的這行數據,被傳送到Cumpute Scalar運算符(Nested Loops左側的),在這一步的過程中Expr1004表達式被重新賦值[Expr1004]=CASE WHEN [Expr1004] IS NULL THEN (0) ELSE [Expr1004] END;重新被賦值的表達式[Expr1004]被傳遞給Filter運算符。

9.Filter運算符接收到數據以后,執行了WHERE:([Expr1004]>(5))的條件判斷;如果條件判斷為真,則把結果傳遞給Sort運算符。

10.Sort運算符接收到數據以后,並不會馬上把數據傳遞到下一步。而是重復4-10的步驟;當所有的行到達Sort運算符后,執行Sort運算符操作,向下一步傳遞按正確順序的行數據。

【示例數據庫腳本】http://files.cnblogs.com/ucos/Northwind.zip

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM