使 Microsoft® SQL Server™ 不執(zhí)行 Transact-SQL 語(yǔ)句。相反,SQL Server 返回有關(guān)語(yǔ)句執(zhí)行方式和語(yǔ)句預(yù)計(jì)所需資源的詳細(xì)信息。
SET SHOWPLAN_ALL { ON | OFF }
SET SHOWPLAN_ALL 的設(shè)置是在執(zhí)行或運(yùn)行時(shí)設(shè)置,而不是在分析時(shí)設(shè)置。
當(dāng) SET SHOWPLAN_ALL 為 ON 時(shí),SQL Server 返回每個(gè)語(yǔ)句的執(zhí)行信息但不執(zhí)行語(yǔ)句,而且 Transact-SQL 語(yǔ)句將不執(zhí)行。將該選項(xiàng)設(shè)置為 ON 后,將返回有關(guān)所有后續(xù) Transact-SQL 語(yǔ)句的信息,直到將該選項(xiàng)設(shè)置為 OFF 為止。例如,如果在 SET SHOWPLAN_ALL 為 ON 時(shí)執(zhí)行 CREATE TABLE 語(yǔ)句,則 SQL Server 從涉及同一個(gè)表的后續(xù) SELECT 語(yǔ)句返回錯(cuò)誤信息;指定的表不存在。因此,對(duì)該表的后續(xù)引用將失敗。當(dāng) SET SHOWPLAN_ALL 為 OFF 時(shí),SQL Server 執(zhí)行語(yǔ)句但不生成報(bào)表。
SET SHOWPLAN_ALL 是供為處理其輸出而編寫的應(yīng)用程序使用的。使用 SET SHOWPLAN_TEXT 返回可由 Microsoft MS-DOS® 應(yīng)用程序(如 osql 實(shí)用工具)讀取的輸出。
在存儲(chǔ)過(guò)程內(nèi)不能指定 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL,它們必須是批處理中的語(yǔ)句。
SET SHOWPLAN_ALL 將信息作為行集返回,行集形成一個(gè)層次結(jié)構(gòu)樹,用以表示 SQL Server 查詢處理器在執(zhí)行每個(gè)語(yǔ)句時(shí)所采取的步驟。輸出中反映的每個(gè)語(yǔ)句都包含一個(gè)含有語(yǔ)句文本的行,后面跟有幾個(gè)含有執(zhí)行步驟詳細(xì)信息的行。下表顯示輸出中包含的列。
列名 | 描述 |
---|---|
StmtText | 對(duì)于不是 PLAN_ROW 類型的行,該列包含 Transact-SQL 語(yǔ)句的文本。對(duì)于 PLAN_ROW 類型的行,該列包含對(duì)操作的描述。該列包含物理運(yùn)算符,也可以選擇包含邏輯運(yùn)算符。該列還可以跟有由物理運(yùn)算符決定的描述。有關(guān)更多信息,請(qǐng)參見(jiàn)邏輯運(yùn)算符和物理運(yùn)算符。 |
StmtId | 當(dāng)前批處理中的語(yǔ)句數(shù)。 |
NodeId | 當(dāng)前查詢內(nèi)的節(jié)點(diǎn) ID。 |
Parent | 上一級(jí)步驟的節(jié)點(diǎn) ID。 |
PhysicalOp | 節(jié)點(diǎn)的物理實(shí)現(xiàn)算法。僅限于 PLAN_ROWS 類型的行。 |
LogicalOp | 該節(jié)點(diǎn)表示的關(guān)系代數(shù)運(yùn)算符。僅限于 PLAN_ROWS 類型的行。 |
Argument | 提供有關(guān)所執(zhí)行操作的輔助信息。該列的內(nèi)容取決于物理運(yùn)算符。 |
DefinedValues | 包含該運(yùn)算符所引入值的用逗號(hào)分隔的列表。這些值可以是出現(xiàn)在當(dāng)前查詢(例如,在 SELECT 列表或 WHERE 子句中)內(nèi)的計(jì)算表達(dá)式,或者是由查詢處理器為處理該查詢而引入的內(nèi)部值。以后在該查詢內(nèi)的任何其它地方都可以引用這些定義的值。僅限于 PLAN_ROWS 類型的行。 |
EstimateRows | 由該運(yùn)算符輸出的預(yù)計(jì)行數(shù)。僅限于 PLAN_ROWS 類型的行。 |
EstimateIO | 該運(yùn)算符的預(yù)計(jì) I/O 成本。僅限于 PLAN_ROWS 類型的行。 |
EstimateCPU | 該運(yùn)算符的預(yù)計(jì) CPU 成本。僅限于 PLAN_ROWS 類型的行。 |
AvgRowSize | 正通過(guò)該運(yùn)算符傳遞的行的預(yù)計(jì)平均行大小(以字節(jié)為單位)。 |
TotalSubtreeCost | 該操作和所有下一級(jí)操作的預(yù)計(jì)(累積)成本。 |
OutputList | 包含當(dāng)前操作所計(jì)劃的列的用逗號(hào)分隔的列表。 |
Warnings | 包含與當(dāng)前操作相關(guān)的警告信息的用逗號(hào)分隔的列表。警告信息可以在列的列表中包含字符串"NO STATS:()"。該警告信息表示查詢優(yōu)化器曾嘗試根據(jù)該列的統(tǒng)計(jì)做決策,但沒(méi)有可用的統(tǒng)計(jì)。因此,查詢優(yōu)化器不得不進(jìn)行推測(cè),這可能已導(dǎo)致選擇低效的查詢計(jì)劃。有關(guān)創(chuàng)建或更新列統(tǒng)計(jì)(這些統(tǒng)計(jì)有助于查詢優(yōu)化器選擇更高效的查詢計(jì)劃)的更多信息,請(qǐng)參見(jiàn) UPDATE STATISTICS。該列可以選擇包含字符串"MISSING JOIN PREDICATE",這表示正在進(jìn)行的聯(lián)接(與表有關(guān))未使用聯(lián)接謂詞。意外地除去聯(lián)接謂詞可能導(dǎo)致查詢的時(shí)間比預(yù)期長(zhǎng)得多,并返回巨大的結(jié)果集。如果出現(xiàn)該警告,請(qǐng)驗(yàn)證是否有意除去了聯(lián)接謂詞。 |
Type | 節(jié)點(diǎn)類型。對(duì)于每個(gè)查詢的父節(jié)點(diǎn),這是 Transact-SQL 語(yǔ)句類型(如 SELECT、INSERT、EXECUTE 等)。對(duì)于表示執(zhí)行計(jì)劃的子節(jié)點(diǎn),這是 PLAN_ROW 類型。 |
Parallel | 0 = 運(yùn)算符沒(méi)有以并行方式運(yùn)行。 1 = 運(yùn)算符正在以并行方式運(yùn)行。 |
EstimateExecutions | 該運(yùn)算符預(yù)計(jì)在當(dāng)前查詢運(yùn)行期間將執(zhí)行的次數(shù)。 |
SET SHOWPLAN_ALL 權(quán)限默認(rèn)授予所有用戶。
下面兩個(gè)語(yǔ)句使用 SET SHOWPLAN_ALL 設(shè)置,顯示 SQL Server 在查詢內(nèi)對(duì)索引的使用進(jìn)行分析和優(yōu)化的方法。
第一個(gè)查詢?cè)谒饕猩系?WHERE 子句中使用等于比較運(yùn)算符 (=)。這在 LogicalOp 列內(nèi)產(chǎn)生聚集索引查找值,在 Argument 列內(nèi)產(chǎn)生索引名。
第二個(gè)查詢?cè)?WHERE 子句中使用 LIKE 運(yùn)算符。這將強(qiáng)制 SQL Server 使用聚集索引掃描并查找滿足 WHERE 子句條件的數(shù)據(jù)。這在含有 Argument 列內(nèi)索引名的 LogicalOp 列內(nèi)產(chǎn)生聚集索引掃描值,在含有 Argument 列內(nèi) WHERE 子句條件的 LogicalOp 列內(nèi)產(chǎn)生篩選值。
EstimateRows 和 TotalSubtreeCost 列內(nèi)用于第一個(gè)基于索引的查詢的值較小,這表示與非索引查詢相比,該查詢的處理速度快得多且使用更少的資源。
USE pubs
GO
SET SHOWPLAN_ALL ON
GO
-- First query.
SELECT au_id
FROM authors
WHERE au_id = '409-56-7008'
GO
-- Second query.
SELECT city
FROM authors
WHERE city LIKE 'San%'
GO
SET SHOWPLAN_ALL OFF
GO
相關(guān)文章