天天看點

sql server 查詢計劃

在你的執行sql 語句之前加上 下面這句話 就可以列出相應的執行計劃

set statistics profile on 
           

  請尊重知識,請尊重原創 更多資料參考請見  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1

執行計劃簡單說明

【Rows】:表示在一個執行步驟中,所産生的記錄條數。(真實資料,非預期)

【Executes】:表示某個執行步驟被執行的次數。(真實資料,非預期)

【Stmt Text】:表示要執行的步驟的描述。

【EstimateRows】:表示要預期傳回多少行資料。

在這個【執行過程表格】中,對于優化查詢來說,我認為前三列是比較重要的。對于前二列,我上面也解釋了,意思也很清楚。 前二列的數字也大緻反映了那些步驟所花的成本,對于比較慢的查詢中,應該留意它們。 【Stmt Text】會告訴你每個步驟做了什麼事情。對于這種表格,它所要表達的其實是一種樹型資訊(一行就表示在圖形方式下的一個節點), 是以,我建議從最内層開始去讀它們。做為示例,我來解釋一下這張表格它所表達的執行過程。

第5行:【Clustered Index Seek(OBJECT:([MyNorthwind].[dbo].[Customers].[PK_Customers]), SEEK:([MyNorthwind].[dbo].[Customers].[CustomerID]=[MyNorthwind].[dbo].[Orders].[CustomerID]) ORDERED FORWARD)】, 意思是說,SQL Server在對表Customers做Seek操作,而且是按照【Clustered Index Seek】的方式,對應的索引是【PK_Customers】,seek的值來源于[Orders].[CustomerID]

第4行:【Clustered Index Scan(OBJECT:([MyNorthwind].[dbo].[Orders].[PK_Orders]), WHERE:([MyNorthwind].[dbo].[Orders].[OrderDate]>='2010-12-01 00:00:00.000' AND [MyNorthwind].[dbo].[Orders].[OrderDate]<'2011-12-01 00:00:00.000'))】, 意思是說,SQL Server在對表Customers做Scan操作,即:最差的【表掃描】的方式,原因是,OrderDate列上沒有索引,是以隻能這樣了。

第3行:【Nested Loops(Left Outer Join, OUTER REFERENCES:([MyNorthwind].[dbo].[Orders].[CustomerID]))】, 意思是說,SQL Server把第5行和第4行産生的資料用【Nested Loops】的方式聯接起來,其中Outer表是Orders,要聯接的比對操作也在第5行中指出了。

第2行:【Compute Scalar(DEFINE:([Expr1006]=isnull([MyNorthwind].[dbo].[Customers].[CustomerName],N'')))】, 意思是說,要執行一個isnull()函數的調用。具體原因請參考本文前部分中給出視圖定義代碼。

第1行:【SELECT [v].[OrderID],[v].[CustomerID],[v].[CustomerName],[v].[OrderDate],[v].[SumMoney],[v].[Finished] FROM [OrdersView] [v] WHERE [v].[OrderDate]>[email protected] AND [v].[OrderDate]<@2】, 通常第1行就是整個查詢,表示它的傳回值。

繼續閱讀