次の方法で共有


SET SHOWPLAN_TEXT (Transact-SQL)

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

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SET SHOWPLAN_TEXT { ON | OFF }

説明

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

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

SET SHOWPLAN_TEXT の目的は、osql ユーティリティなどの Microsoft Win32 コマンド プロンプト アプリケーションが読み取れる形式の出力を返すことです。SET SHOWPLAN_ALL を使用するとさらに詳細な出力が返され、その出力を取り扱うように設計されたプログラムで使用できます。

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

SET SHOWPLAN_TEXT では情報が行セットとして返されます。これは階層構造になっており、SQL Server クエリ プロセッサで各ステートメントが実行されるときのステップを表しています。出力結果には、ステートメントごとに、ステートメントのテキストを示す 1 行と、実行ステップの詳細を示す複数行が含まれます。次の表に、出力結果に含まれる列を示します。

列名

説明

StmtText

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

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

権限

SET SHOWPLAN_TEXT を使用するには、SET 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 ステートメントを実行するための適切な権限だけが必要です。

詳細については、「プラン表示のセキュリティ」および「SHOWPLAN 権限と Transact-SQL バッチ」を参照してください。

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

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

USE AdventureWorks2008R2;
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:([AdventureWorks2008R2].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks2008R2].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD) 

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

USE AdventureWorks2008R2;
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:([AdventureWorks2008R2].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks2008R2].[Production].[ProductCostHistory].[StandardCost]<[@1]))