我喜歡把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腳本做出性能建議。
新聞熱點
疑難解答