1. 程式人生 > >使用查詢分析器調整SQL伺服器指令碼

使用查詢分析器調整SQL伺服器指令碼

喜歡把SQL伺服器所捆綁的工具看作是倒金字塔型的,診斷和檢查一般問題的工具在頂端,尋找和診斷問題具體區域的工具在底部。除了提供一種編寫SQL指令碼的便捷方式之外,在你需要解決特定SQL腳本里明確問題的時候,查詢分析器(Query Analyzer)還是所需要使用的資源。如果你需要指出哪個查詢正在保持著某個特定表格的鎖定狀態,你也會希望使用查詢分析器。

查詢分析器的關鍵診斷特性是它能夠顯示某個查詢的執行計劃。這個執行計劃會向你提供各種型別的有用資訊,例如在查詢的執行期間如何以及何時使用或者不使用索引。它還會提供許多其他的細節,例如排序、平行(parallelism)、巢狀迴圈,以及SQL伺服器在執行指定查詢時必須做的其他事情。
計劃的好處

有了查詢分析器,你就可以檢視預計計劃而不需要執行查詢本身,或者在查詢執行之後檢視真實的計劃。很顯然,真實的計劃會更加準確,因為它是從物理上對資料庫執行查詢的。但是對於系統負載巨大和/或長期的查詢,這種方法可能就不是最好的選擇了。在典型情況下,當我認為某個特定的查詢有問題的時候,或者如果我預計有一個查詢會在應用程式裡被足夠頻繁地呼叫以至於可能會導致效能問題的時候,我就會執行這個工具。

你可以通過把SQL表示式輸入查詢分析器再按[Ctrl]L來檢視預計的執行計劃。執行計劃然後就會顯示在結果(Results)面板的選項卡里。執行計劃在剛開始的時候可能比較難讀,因為它不像英語一樣是從左往右讀的,而是從右往左讀的。

執行中的計劃

這裡有一個你可以跟著做的例子,從這個例子裡你可以看到如何使用查詢分析器來檢視一個執行計劃。考慮一下下面查詢,它會從Northwind資料庫裡返回某個僱員所在的地點和相關地區:
 
SELECT
TerritoryDescription, RegionDescription
FROM
Employees e
JOIN EmployeeTerritories et ON e.employeeid = et.employeeid
JOIN Territories t ON et.territoryid = t.territoryid
JOIN Region r ON t.regionid = r.regionid
WHERE
e.employeeid = 1
ORDER BY
TerritoryDescription, RegionDescription


 
這個查詢的結果顯示:一號EmployeeId在東部(Eastern)有兩個地區,如A所示。

圖A

查詢結果

圖B顯示了SQL伺服器從示例查詢所生成的預計執行。這個圖示中的每個節點都代表著SQL服務期執行示例查詢所採取的步驟。要注意,每個節點包括一個預計的相對消耗,以及執行計劃被顯示的時候SQL伺服器所使用的每個索引的名稱。

圖B

執行計劃

你可以把滑鼠放在執行計劃的每個節點上以獲取更多關於該步驟的資訊,例如該節點所代表的操作型別、受影響的行數,以及和該步相關的消耗的分解。C顯示的是圖B裡針對第一個節點的額外資訊。這些彈出窗口裡的資訊能夠提示你可以對查詢做出哪些改進,如果能夠改進的話。

圖C



和索引調節嚮導一起使用

你可以將查詢分析器和SQL伺服器的索引調節嚮導(Server’s Index Tuning Wizard,ITW)一起使用。我通常使用SQL伺服器的Profiler來收集要送入ITW的資料。但是有時候,我會使用查詢分析器,如果我認為它代表著我正在進行測試時的某種活動型別的話。你可以從查詢(Query)選單來訪問ITW;它能夠對在活動編輯面板裡的SQL指令碼做出效能建議。