set showplan_all
使 microsoft® sql server™ 不執行 transact-sql 語句。相反,sql server 返回有關語句執行方式和語句預計所需資源的詳細資訊。
語法set showplan_all
注釋set showplan_all 的設定是在執行或執行時設定,而不是在分析時設定。
當 set showplan_all 為 on 時,sql server 返回每個語句的執行資訊但不執行語句,而且 transact-sql 語句將不執行。將該選項設定為 on 後,將返回有關所有後續 transact-sql 語句的資訊,直到將該選項設定為 off 為止。例如,如果在 set showplan_all 為 on 時執行 create table 語句,則 sql server 從涉及同乙個表的後續 select 語句返回錯誤資訊;指定的表不存在。因此,對該錶的後續引用將失敗。當 set showplan_all 為 off 時,sql server 執行語句但不生成報表。
set showplan_all 是供為處理其輸出而編寫的應用程式使用的。使用 set showplan_text 返回可由 microsoft ms-dos® 應用程式(如osql 實用工具)讀取的輸出。
在儲存過程內不能指定 set showplan_text 和 set showplan_all,它們必須是批處理中的語句。
set showplan_all 將資訊作為行集返回,行集形成乙個層次結構樹,用以表示 sql server 查詢處理器在執行每個語句時所採取的步驟。輸出中反映的每個語句都包含乙個含有語句文字的行,後面跟有幾個含有執行步驟詳細資訊的行。下表顯示輸出中包含的列。
列名 描述
stmttext 對於不是 plan_row 型別的行,該列包含 transact-sql 語句的文字。對於 plan_row 型別的行,該列包含對操作的描述。該列包含物理運算子,也可以選擇包含邏輯運算子。該列還可以跟有由物理運算子決定的描述。有關更多資訊,請參見邏輯運算子和物理運算子。
stmtid 當前批處理中的語句數。
nodeid 當前查詢內的節點 id。
parent 上一級步驟的節點 id。
physicalop 節點的物理實現演算法。僅限於 plan_rows 型別的行。
logicalop 該節點表示的關係代數運算子。僅限於 plan_rows 型別的行。
argument 提供有關所執行操作的輔助資訊。該列的內容取決於物理運算子。
definedvalues 包含該運算子所引入值的用逗號分隔的列表。這些值可以是出現在當前查詢(例如,在 select 列表或 where 子句中)內的計算表示式,或者是由查詢處理器為處理該查詢而引入的內部值。以後在該查詢內的任何其它地方都可以引用這些定義的值。僅限於 plan_rows 型別的行。
estimaterows 由該運算子輸出的預計行數。僅限於 plan_rows 型別的行。
estimateio 該運算子的預計 i/o 成本。僅限於 plan_rows 型別的行。
estimatecpu 該運算子的預計 cpu 成本。僅限於 plan_rows 型別的行。
**growsize 正通過該運算子傳遞的行的預計平均行大小(以位元組為單位)。
totalsubtreecost 該操作和所有下一級操作的預計(累積)成本。
outputlist 包含當前操作所計畫的列的用逗號分隔的列表。
warnings 包含與當前操作相關的警告資訊的用逗號分隔的列表。警告資訊可以在列的列表中包含字串"no stats:()"。該警告資訊表示查詢優化器曾嘗試根據該列的統計做決策,但沒有可用的統計。因此,查詢優化器不得不進行推測,這可能已導致選擇低效的查詢計畫。有關建立或更新列統計(這些統計有助於查詢優化器選擇更高效的查詢計畫)的更多資訊,請參見update statistics。該列可以選擇包含字串"missing join predicate",這表示正在進行的聯接(與表有關)未使用聯接謂詞。意外地除去聯接謂詞可能導致查詢的時間比預期長得多,並返回巨大的結果集。如果出現該警告,請驗證是否有意除去了聯接謂詞。
type 節點型別。對於每個查詢的父節點,這是 transact-sql 語句型別(如 select、insert、execute 等)。對於表示執行計畫的子節點,這是 plan_row 型別。
parallel 0 = 運算子沒有以並行方式執行。1 = 運算子正在以並行方式執行。
estimateexecutions 該運算子預計在當前查詢執行期間將執行的次數。
許可權set showplan_all 許可權預設授予所有使用者。
示例下面兩個語句使用 set showplan_all 設定,顯示 sql server 在查詢內對索引的使用進行分析和優化的方法。
第乙個查詢在索引列上的 where 子句中使用等於比較運算子 (=)。這在 logicalop 列內產生聚集索引查詢值,在argument 列內產生索引名。
第二個查詢在 where 子句中使用 like 運算子。這將強制 sql server 使用聚集索引掃瞄並查詢滿足 where 子句條件的資料。這在含有 argument 列內索引名的 logicalop 列內產生聚集索引掃瞄值,在含有 argument 列內 where 子句條件的logicalop 列內產生篩選值。
estimaterows 和 totalsubtreecost 列內用於第乙個基於索引的查詢的值較小,這表示與非索引查詢相比,該查詢的處理速度快得多且使用更少的資源。
use pubsgoset showplan_all ongo-- first query.select au_id from authors where au_id = '409-56-7008'go-- second query.select cityfrom authorswhere city like 'san%'goset showplan_all offgo
引用自
SQL Server 執行計畫
預讀 邏輯讀 物理讀的解釋 預讀 sql server查詢的時候會在記憶體中生成查詢計畫,但在同時會去硬碟上取估計的資料放入快取 邏輯讀 從快取中讀取資料 物理讀 當快取中也沒有的時候,就回去硬碟讀 檢視語句執 況 set statistics profile on set statistics i...
SQL Server 執行計畫
預讀 邏輯讀 物理讀的解釋 預讀 sql server查詢的時候會在記憶體中生成查詢計畫,但在同時會去硬碟上取估計的資料放入快取 邏輯讀 從快取中讀取資料 物理讀 當快取中也沒有的時候,就回去硬碟讀 檢視語句執 況 set statistics profile on set statistics i...
Sql Server 執行計畫
1.每次執行sql語句都會生成執行計畫並快取起來,因為生成執行計畫也需要時間開銷,因此重用執行計畫將能提高效能,並節省緩衝區空間。我們可以使用sys.dm exec cached plans sys.dm exec sql text sys.dm exec query plan來查詢快取的執行計畫。...