當一個查詢到達數據庫引擎時,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