EXPLAIN (SQL)
構文
EXPLAIN [ALT | ALL] [STAT | STATS] [INTO :host-variable] query
説明
EXPLAIN コマンドは、指定されたクエリのクエリ・プランを XML タグが付けられたテキスト文字列として返します。このクエリ・プランは、Plan という名前の単一のフィールドで構成される結果セットとして返されます。
query には SELECT、DELETE、UPDATE のいずれかのクエリを指定する必要があります。INSERT query を指定すると、SQLCODE -474 が返されます。他のキーワードを指定して EXPLAIN を使用すると、SQLCODE -51 が返されます。[プラン表示] を使用して、他のクエリ (SELECT 節を使用した INSERT クエリなど) のクエリ・プランを表示できます。EXPLAIN コマンドによる query 参照が実行されると、すべてのエラーが処理およびスローされます。
ALT キーワードと STAT キーワードは任意の順序で指定できます。INTO キーワードは、これらのキーワードの後に指定する必要があります。オプションの ALT キーワードは、代替クエリ・プランを生成します。代替クエリ・プランはすべて、同じ XML タグが付いたテキスト文字列で返されます。正規化された query テキスト (<sql> としてタグ付け) は、各クエリ・プランの前にリストされます。オプションの STAT キーワードは、クエリ・プランの各モジュールに対して実行時パフォーマンス統計を生成します。STAT キーワードは、SELECT クエリでのみサポートされています。クエリ・プランを格納した XML タグ テキスト文字列に実行時統計も記述されます。各モジュールについて以下の統計が収集されます。
-
<ModuleName> : モジュール名。
-
<TimeSpent> : モジュールの総実行時間 (秒単位)。
-
<GlobalRefs> : グローバル参照の数。
-
<LinesOfCode> : コード実行行数。
-
<DiskWait> : ディスク待機時間 (秒単位)。
-
<RowCount> : 結果セット内の行数。
-
<ModuleCount> : このモジュールが実行された回数。
-
<Counter> : このプログラムが実行された回数。
これらの統計は、クエリ・プランのテキスト内で、XML タグが付けられたテキスト文字列として返されます。関連付けられているクエリ・プランの前に、クエリ・プラン内のすべてのモジュールのパフォーマンス統計が返されます。埋め込み SQL では、実行時パフォーマンス統計を生成したり返したりすることはできません。STAT キーワードは無視され、エラーは発行されません。
EXPLAIN コマンドを発行するには、%SYSTEM.QUERY_PLAN プロシージャを実行する特権が必要です。
EXPLAIN コマンドは、$SYSTEM.SQL.Explain()Opens in a new tab メソッドを呼び出して、その結果セットを XML タグが付けられたテキスト文字列が含まれる単一のフィールドの形式にすることによって、プラン表示の結果を返します。EXPLAIN ALT コマンドは、修飾子 all=1 を付けて $SYSTEM.SQL.Explain()Opens in a new tab メソッドを呼び出して、その結果セットを XML タグが付けられたテキスト文字列が含まれる単一のフィールドの形式にすることによって、[別のプランを表示] の結果を返します。
このコマンドは、埋め込み SQL、ダイナミック SQL、SQL シェル、管理ポータル、JDBC、および ODBC インタフェースでの使用が全面的にサポートされます。
結果セット XML の構造
以下に、EXPLAIN ALT STAT query の、XML タグが付けられたテキスト文字列の構造を示します。改行、インデント、およびコメントの注は説明のために付けられています。
<plans> /* tag included even if there is only one plan */ <plan> /* the first query plan */ <sql> /* the normalzed SELECT statement text */ </sql> <cost value="1147000"/> /* if STAT, include the following <stats> tags */ <stats> <ModuleName>MAIN</ModuleName> /* XML-tagged list of stats (above) for MAIN module */ </stats> <stats> <ModuleName>FIRST</ModuleName> /* XML-tagged list of stats (above) for FIRST module */ </stats> <stats> /* additional modules */ </stats> /* text of query plan */ </plan> <plan> /* if ALT, same info for first alternate plan */ ... </plan> </plans>
Explain() メソッド
$SYSTEM.SQL.Explain()Opens in a new tab メソッドを使用して、ObjectScript から同じクエリ・プラン情報を返すことができます。以下に例を示します。
SET myquery=2
SET myquery(1)="SELECT Name,Age FROM Sample.Person WHERE Name %STARTSWITH 'Q' "
SET myquery(2)="ORDER BY Age"
SET status=$SYSTEM.SQL.Explain(.myquery,{"all":0},,.plan)
IF status'=1 {WRITE "Explain() failed:" DO $System.Status.DisplayError(status) QUIT}
ZWRITE plan
引数
ALT
代替クエリ・プランを返す引数 (オプション)。既定では、1 つのクエリ・プランを返します。
STAT
(ダイナミック SQL のみ) : クエリ・プランの実行時パフォーマンス統計を返す引数 (オプション)。既定では、実行時統計なしでクエリ・プランを返します。この構文は、埋め込み SQL では無視されます。
INTO :host-variable
(埋め込み SQL のみ) : クエリ・プランが配置される出力ホスト変数 (オプション)。この構文は、ダイナミック SQL では無視されます。
query
例
以下の例では、クエリ・プランが XML 文字列で返されます。最初に SQL クエリ文字列、次にクエリ・プランが返されます。
EXPLAIN SELECT Name,DOB FROM Sample.Person WHERE Name [ 'Q'
以下の例では、クエリ・プランとパフォーマンス統計が XML 文字列で返されます。最初に SQL クエリ文字列、次にパフォーマンス統計 (モジュール別)、その次にクエリ・プランが返されます。
EXPLAIN STAT SELECT Name,DOB FROM Sample.Person WHERE Name [ 'Q'
以下の例では、代替クエリ・プランが XML 文字列で返されます。最初に SQL クエリ文字列、次に各クエリ・プランが返されます。
EXPLAIN ALT SELECT Name,DOB FROM Sample.Person WHERE Name [ 'Q'
以下の例では、より複雑なクエリ・プランが返されます。クエリ・プランの前と内部の両方にパフォーマンス統計が表示されます。
EXPLAIN STAT SELECT p.Name AS Person, e.Name AS Employee
FROM Sample.Person AS p, Sample.Employee AS e
WHERE p.Name %STARTSWITH 'Q' GROUP BY e.Name ORDER BY p.Name
以下の埋め込み SQL の例は、クエリ・プランを XML 文字列として返します。最初に SQL クエリ文字列、次にクエリ・プランが返されます。
#sqlcompile select=Runtime
&sql(EXPLAIN INTO :qplan SELECT Name,DOB FROM Sample.Person WHERE Name [ 'Q')
WRITE qplan
以下の埋め込み SQL の例は、代替クエリ・プランを XML 文字列として返します。最初に SQL クエリ文字列、次に 1 つ目のクエリ・プラン、その次に SQL クエリ文字列、続いて 2 つ目のクエリ・プランというように返されます。
#sqlcompile select=Runtime
&sql(EXPLAIN ALT INTO :qplans SELECT Name,DOB FROM Sample.Person WHERE Name [ 'Q')
WRITE qplans
以下の埋め込み SQL の例は、クエリ・プランを返します。STAT キーワードは無視されます。
#sqlcompile select=Runtime
&sql(EXPLAIN STAT INTO :qplan SELECT Name,DOB FROM Sample.Person WHERE Name [ 'Q')
WRITE qplan