英文原帖:
http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-execution-plan
有很多方法獲得執行計劃,使用哪種根據情況決定。通常你可以使用SQL Server Management Studio來獲得執行計劃,然而如果因爲某些原因你不能在SQL Server Management Studio中運行查詢,那麼你會發現SQL Server Profiler或者探測執行計劃緩存會對獲得執行計劃有幫助。
方法1 – 使用SQL Server Management Studio
SQL Server有很多簡單屬性讓我們非常容易捕獲執行計劃,簡單來說確保“Include Actual Execution Plan”菜單(在“Query”菜單下可被找到)被選中,並運行查詢。
如果你嘗試對存儲過程中的語句獲得執行計劃,那麼你應該執行該存儲過程,像這樣:
exec p_Example 42
當查詢執行完成,你會看到一個額外的“Execution plan”標籤頁出現在結果面板。如果你運行了很多語句,你會在這個標籤頁看到很多執行計劃。
從這裏你可以在SQL Server Management Studio裏檢查到執行計劃,或者在面板上右擊並選擇“Save Execution Plan As…”保存執行計劃到一個XML格式文件。
方法2 – 使用SHOWPLAN選項
該方法非常類似於方法1(事實上這是SQL Server Management Studio的內部實現),然而我包含它用於完成或者如果你沒有SQL Server Management Studio可用。
在運行你的查詢之前,運行以下語句之一。語句必須是這批語句中的唯一一個,例如,你不能在同時執行另一個語句:
SET SHOWPLAN_TEXT ON SET SHOWPLAN_ALL ON SET SHOWPLAN_XML ON SET STATISTICS PROFILE ON SET STATISTICS XML ON -- The is the recommended option to use
這些是連接級別的選項,因此你只需對每個連接運行一次。這麼說所有運行的語句完成後,將會有一個包含以你期望的格式的執行計劃的額外結果集 – 像平常一樣運行你的查詢就會看到這個面板。
一旦執行完後,你可以使用如下語句關閉這個選項:
SET <<option>> OFF
比較執行計劃格式
除非你有非常強烈的偏好,我的推薦是使用STATISTICS XML選項。這個選項等於SQL Server Management Studio中的“Include Actual Execution Plan”選項,並以最方便的格式提供了最豐富的信息。
. SHOWPLAN_TEXT – 顯示了一個基本的基於文本的預估執行計劃,而不必執行查詢。
. SHOWPLAN_ALL – 顯示帶有消耗預估值的基於文本的預估執行計劃,而不必執行查詢。
. SHOWPLAN_XML – 顯示帶有消耗預估值的基於XML的預估執行計劃,而不必執行查詢。等於在SQL Server Management Studio中的“Display Estimated Execution Plan…”選項。
. STATISTICS PROFILE – 執行查詢並顯示基於文本的實際執行計劃。
. STATISTICS XML – 執行查詢並顯示基於XML的實際執行計劃。等於在SQL Server Management Studio中的“Include Actual Execution Plan”選項。
方法3 – 使用SQL Server Profiler
如果你不能直接運行查詢(或者當你直接執行它時你的查詢不能緩慢運行 – 記住我們想要一個性能不佳的查詢的執行計劃),那麼你可以使用SQL Server Profiler跟蹤來捕獲執行計劃。想法是運行查詢時,捕獲“Showplan”事件的跟蹤正在運行。
注意在生產環境上根據負載情況使用該方法,顯然你應該小心使用。SQL Server Profiling架構被設計爲最小化數據庫影響,但是並不意味着沒有任何性能影響。如果數據在高負載下使用,在你的跟蹤裏過濾和識別正確的執行計劃也有問題。你顯然應該與DBA一起看看他們是否願意你在珍貴的數據庫上做這些!
打開SQL Server Profiler並創建一個新的跟蹤,連接到你想記錄跟蹤的數據庫上。
在“Event Selection”標籤下選擇“Show all events”,選擇“Performance”->“Showplan”行並運行跟蹤。
當跟蹤運行時,你需要去做的是運行該慢查詢。
等待查詢完成並停止跟蹤。
爲了保存跟蹤,在SQL Server Profiler中右鍵點擊XML格式執行計劃,並選擇“Extract event data..”來以XML格式保存執行計劃。
你獲得的執行計劃等於在SQL Server Management Studio中選擇“Include Actual Execution Plan”選項。
方法4 – 探測查詢緩存
如果你不能直接運行查詢,並且你也不能捕獲Profiler跟蹤,你仍然可以通過探測SQL查詢的執行計劃緩存獲得預估的執行計劃。
我們通過查詢SQL Server DMV探測執行計劃緩存。以下是一個基本的查詢,用於列出所有的查詢計劃(以XML格式)以及它們的SQL文本。對大多數數據庫你也需要添加額外的過濾從句,過濾出你感興趣的執行計劃。
SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) CROSS APPLY sys.dm_exec_query_plan(plan_handle)
執行該查詢並點擊XML格式的執行計劃,來在新窗口打開該這行計劃 – 右鍵點擊並選擇“Save execution plan as …”以XML格式保存執行計劃到文件。
注意:
因爲有很多因素(從表和索引結構到數據存儲和表統計信息)促使你應該總是從你感興趣的(通常是經歷一個性能問題的數據庫)數據庫獲得執行計劃。
你不能捕獲加密存儲過程的執行計劃。
“actual”VS“estimated”執行計劃
實際執行計劃是SQL Server實際運行查詢時的執行計劃,而預估執行計劃是SQL Server在沒有執行查詢時預估出要做什麼。儘管邏輯上相等,實際執行計劃更有用應該它包含了當查詢執行時實際發生了什麼的額外的細節和統計信息。當在SQL Server預估值爲OFF的地方診斷問題的時候,它是必須的(例如當統計信息過期時)。
如果解釋一個查詢的執行計劃?
該主題值得寫一本書《SQL Server Execution Plan》。(譯者注:該書已出第2版)
參考:
. 執行計劃基礎