SET SHOWPLAN_TEXT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

Microsoft SQL Server で Transact-SQL ステートメントを実行せず、 代わりに、SQL Server はステートメントの実行方法に関する詳細情報を返します。

Transact-SQL 構文表記規則

構文

  
SET SHOWPLAN_TEXT { ON | OFF }  

解説

SET SHOWPLAN_TEXTの設定は、解析時ではなく実行時に設定されます。

SET SHOWPLAN_TEXTがONの場合、SQL Serverは実行せずに各 Transact-SQL 文の実行情報を返します。 返される情報は、このオプションが ON に設定されてから OFF に設定されるまでに発行されたすべての SQL Server ステートメントに関する実行プラン情報です。 例えば、CREATE TABLE文がSETSET SHOWPLAN_TEXTがONの状態で実行されると、SQL Server同じテーブルを含む後のSELECT文からエラーメッセージが返され、指定されたテーブルが存在しないことをユーザーに知らせます。 その後、このテーブルに対して行われる参照は失敗します。 SET SHOWPLAN_TEXTがオフのとき、SQL Server実行計画情報を含むレポートを生成せずに文を実行します。

SET SHOWPLAN_TEXTMicrosoft Win32のコマンドプロンプトアプリケーション(sqlcmdユーティリティなど)に対して読み取れる出力を返すことを意図しています。 SET SHOWPLAN_ALL 出力を処理するために設計されたプログラムで使用されることを意図した、より詳細な出力を返します。

SET SET SHOWPLAN_TEXT そして SETSET SHOWPLAN_ALL はストアドプロシージャ内で指定できません。 またバッチ内で同時に他のステートメントを実行することもできません。

SET SHOWPLAN_TEXT情報は、SQL Serverクエリプロセッサが各文を実行する際に取るステップを表す階層的な木を形成する行の集合として返します。 出力結果には、ステートメントごとに、ステートメントのテキストを示す 1 行と、実行ステップの詳細を示す複数行が含まれます。 次の表に、出力に含まれる列を示します。

列名 説明
StmtText PLAN_ROW 型でない行の場合、この列には Transact-SQL ステートメントのテキストが含まれます。 PLAN_ROW 型の行の場合、この列には操作の説明が含まれます。 またこの列には物理操作と、必要に応じて論理操作が含まれます。 場合によっては、この列の後に説明が含まれます。説明が後に続くかどうかは、物理操作によって決まります。 物理演算子の詳細については、SET SHOWPLAN_ALL(Transact-SQL)「引数」列を参照してください。

プラン表示の出力に含まれる物理操作と論理操作の詳細については、「プラン表示の論理操作と物理操作のリファレンス」を参照してください。

アクセス許可

SET SET SHOWPLAN_TEXTを使用するには、SETSET SHOWPLAN_TEXTを実行する文を実行するための十分な権限を持ち、参照対象オブジェクトを含むすべてのデータベースに対してSHOWPLAN権限が必要です。

SELECT、 INSERT、 UPDATE、 DELETE、EXEC stored_procedure、EXEC user_defined_function 文を作成する場合、ユーザーは以下の条件を要求します:

  • Transact-SQL ステートメントを実行するための適切な権限。

  • SHOWPLAN 権限。これは、Transact-SQL ステートメントで参照されるオブジェクト (テーブルやビューなど) を含むすべてのデータベースに対して必要です。

DDL、USE database_name、 SET、DECLARE、動的SQLなど、その他の文については、Transact-SQL 文を実行するための適切な権限のみが必要です。

次の例では、SQL Server でステートメントを処理するときのインデックスの使用方法を示します。

インデックスを使用するクエリは次のとおりです。

USE AdventureWorks2022;  
GO  
SET SHOWPLAN_TEXT ON;  
GO  
SELECT *  
FROM Production.Product   
WHERE ProductID = 905;  
GO  
SET SHOWPLAN_TEXT OFF;  
GO  

結果セットは次のようになります。

StmtText                                             
---------------------------------------------------  
SELECT *  
FROM Production.Product   
WHERE ProductID = 905;   
  
StmtText                                                                                                                                                                                        
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
|--Clustered Index Seek(OBJECT:([AdventureWorks2022].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks2022].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)   

インデックスを使用しないクエリは次のとおりです。

USE AdventureWorks2022;  
GO  
SET SHOWPLAN_TEXT ON;  
GO  
SELECT *  
FROM Production.ProductCostHistory  
WHERE StandardCost < 500.00;  
GO  
SET SHOWPLAN_TEXT OFF;  
GO  

結果セットは次のようになります。

StmtText                                                                  
------------------------------------------------------------------------  
SELECT *  
FROM Production.ProductCostHistory  
WHERE StandardCost < 500.00;   
  
StmtText                                                                                                                                                                                                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
|--Clustered Index Scan(OBJECT:([AdventureWorks2022].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks2022].[Production].[ProductCostHistory].[StandardCost]<[@1]))  

参照

演算子 (Transact-SQL)
SET ステートメント (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)