PLAN_TABLE
プラン表 PLAN_TABLE には、EXPLAIN ステートメントの結果から収集されるアクセス・パスに関する情報が含まれています。
IBM® Db2 Administration Foundation for z/OS® や IBM Db2 for z/OS Developer Extension などのツールのビジュアルな説明機能を使用することで、SQL 文で使用されるアクセスパスの図を生成することができます。
修飾子
サブシステムまたはデータ共用グループには、ユーザー ID によって修飾されるこれらの表の複数インスタンスを含めることができます。 これらの表には、EXPLAIN ステートメントまたはバインドを発行する場合に、ステートメントのコスト情報が追加されます。 これらの表には、BIND コマンドまたは REBIND コマンドで EXPLAIN(YES) か EXPLAIN(ONLY) を指定した場合にも情報が追加されます。 SQL 最適化ツールも、ユーザー ID で修飾された EXPLAIN 表を作成する場合があります。 この表のインスタンスを作成するための SQL ステートメントは、SDSNSAMP ライブラリーのメンバー DSNTESC にあります。
サンプルの CREATE TABLE ステートメント
各 EXPLAIN テーブルのサンプル CREATE TABLE ステートメントは、 プレフィックス. SDSNSAMP ライブラリのメンバー DSNTESC にあります。 EXPLAINテーブルを現在の Db2 の形式にアップグレードするには、ADMIN_EXPLAIN_MAINTストアド・プロシージャを呼び出します。 ADMIN_EXPLAIN_MAINTは、EXPLAINテーブルを作成したり、現在の Db2 リリース用のフォーマットにアップグレードしたり、その他の保守作業を行うこともできます。 アクション入力パラメータを使用してこれらの各タスクを要求する方法については、 ADMIN_EXPLAIN_MAINTストアド・プロシージャを参照してください。 また、EXPLAINテーブルを現在の Db2 の形式にアップグレードするタスクのみを実行する場合は、ジョブDSNTIJXAを実行することもできます。 DSNTIJXAは、アップグレードを実行するために REXX のexecコマンドDSNTXTAを呼び出します。 DSNTIJXA の実行に関する詳細については、「移行ステップ 25: EXPLAIN テーブルを現在の形式に変換する」を参照してください。
オプションの PLAN_TABLE フォーマット
Db2 12 フォーマット
サンプルの CREATE TABLE ステートメントに示されるすべての列 (PER_STMT_ID 列 (COLCOUNT=67) まで)。
- Db2 11 形式
- サンプルの CREATE TABLE ステートメントに示されるすべての列 (EXPANSION_REASON 列 (COLCOUNT=66) まで)。 このフォーマットは Db2 12 で非推奨となっています。
列の説明
サブシステムまたはデータ共用グループには、これらの表の複数を備えることができます。これには、修飾子 SYSIBM を持つ表、修飾子 DB2OSCA を持つ表、およびユーザー ID によって修飾される追加の表が含まれます。
次の表は、PLAN_TABLE の列の説明を示しています。
| 列名 | データ型 | 説明 |
|---|---|---|
| QUERYNO | 非 NULL の整数 | 解釈されるステートメントを識別する番号。 元になる値は、行のコンテキストに応じて異なります。
QUERYNO の値がソース・プログラム内のステートメント番号に基づく場合、32767 を超える値は 0 として報告されます。 ただし、まれに、値が固有であることが保障されない場合があります。
|
| QBLOCKNO | SMALLINT NOT NULL | 照会内の各照会ブロックを識別する番号。 この番号の値は、特定の順序でもなければ、必ずしも連続していません。 |
| APPLNAME | VARCHAR(24) NOT NULL | 行のアプリケーション・プランの名前。 プランから実行される組み込み EXPLAIN ステートメント、またはプランのバインド実行時に解釈されるステートメントのみに適用される。 ブランクは、列が適用外であることを示します。
|
| PROGNAME | VARCHAR(128) NOT NULL | 解釈されているステートメントが含まれているプログラムまたはパッケージの名前。 組み込み EXPLAIN ステートメントと、プランまたはパッケージのバインド結果として
解釈されたステートメントに適用される。 ブランクは、列が適用外であることを示します。
|
| PLANNO | SMALLINT NOT NULL | QBLOCKNO に示された照会が処理されたステップ の番号。 この列はステップが実行された順序を示す。 |
| METHOD | SMALLINT NOT NULL | ステップに使用される結合方式を示す番号。
|
| CREATOR | VARCHAR(128) NOT NULL | このステップでアクセスされる新規表の作成者。METHOD が 3 の場合にはブランク。 |
| TNAME | VARCHAR(128) NOT NULL | 以下のいずれかのオブジェクトの名前。
|
| TABNO | SMALLINT NOT NULL | IBM 専用です。 |
| ACCESSTYPE 1 | CHAR(2) NOT NULL | 新しいテーブルにアクセスする方法。
|
| MATCHCOLS | SMALLINT NOT NULL | ACCESSTYPE I、IN、I1、N、NR、MX、または DX の場合、索引スキャンで使用される索引キーの数。それ以外の場合は 0。 |
| ACCESSCREATOR | VARCHAR(128) NOT NULL | ACCESSTYPE I、I1、N、NR、MX、または DX の場合、索引の作成者。それ以外の場合は 0。 |
| ACCESSNAME | VARCHAR(128) NOT NULL | ACCESSTYPE I、I1、H、MH、N、NR、MX、または DX の場合、索引の名前。ACCESSTYPE P の場合、DSNPJW(mixopseqno) は MIXOPSEQ 内の開始ペアワイズ結合レグ。それ以外の場合は、ブランク。 |
| INDEXONLY | CHAR(1) NOT NULL | 索引にアクセスするだけでステップの実行に十分であるかどうかの表示。または、データへのアクセスも必要かどうかの表示。
|
| SORTN_UNIQ | CHAR(1) NOT NULL | 重複行を除去するために新規表がソートされるかどうかの表示。
|
| SORTN_JOIN | CHAR(1) NOT NULL | 結合方式 2 または 4 のために
新規表がソートされるかどうかの表示。
|
| SORTN_ORDERBY | CHAR(1) NOT NULL | ORDER BY により新規表
がソートされるかどうかの表示。
|
| SORTN_GROUPBY | CHAR(1) NOT NULL | GROUP BY により新規表
がソートされるかどうかの表示。
|
| SORTC_UNIQ | CHAR(1) NOT NULL | 重複行を除去するために複合表
がソートされるかどうかの表示。
|
| SORTC_JOIN | CHAR(1) NOT NULL | 結合方式 1、2 または 4 のために
複合表がソートされるかどうかの表示。
|
| SORTC_ORDERBY | CHAR(1) NOT NULL | ORDER BY 文節または比較述部に対して
複合表がソートされるかどうかの表示。
|
| SORTC_GROUPBY | CHAR(1) NOT NULL | GROUP BY 文節のために複合表
がソートされるかどうかの表示。
|
| TSLOCKMODE | CHAR(3) NOT NULL | 新規表、またはその表スペースや表スペース・パーティションの
いずれかに設定するロックのモードの指示。 バインド時に分離を判別できる場合は、次の値が示される。
次の行に続く。 |
| TSLOCKMODE (continued) | 前の行からの続き。 この列のデータは右そろえ。 例えば、IX の場合、ブランクの後に I と X が続く。 列にブランクが含まれる場合、ロックは獲得されていない。 ACCESSTYPE 列のアクセス方式が DX、DI、または DU である場合、XML 索引ページでラッチは獲得されず、新規基本表のデータ・ページまたは行でロックは獲得されず、XML 表と対応する表スペースでも獲得されない。 この場合、TSLOCKMODE の値はブランク。 |
|
| TIMESTAMP | CHAR(16) NOT NULL | この列は推奨されません。 代わりに、EXPLAIN_TIME を使用してください。 |
| REMARKS | VARCHAR(762) NOT NULL | 762 文字以下の任意の文字ストリングを挿入できるフィールド。 |
| PREFETCH | CHAR(1) NOT NULL WITH DEFAULT | プリフェッチによってデータ・ページが事前に読み取られるかどうかの表示。
|
| COLUMN_FN_EVAL | CHAR(1) NOT NULL WITH DEFAULT | SQL 集約関数が評価される時点。
|
| MIXOPSEQ | SMALLINT NOT NULL WITH DEFAULT | 複数索引操作におけるステップのシーケンス番号。
|
| VERSION | varchar(122)notNULL、デフォルト | パッケージのバージョン ID。 パッケージから実行された組み込み EXPLAIN ステートメントと、パッケージのバインド実行時に解釈されたステートメント、または最適化ヒントのために手動で作成された PLAN_TABLE 行にのみ適用される。 値がブランクでない場合、値は以下のいずれかと同一になる。
EXPLAIN ステートメントの実行によって、または EXPLAIN オプションによるパッケージのバインドによって作成された行の場合、ステートメントのバージョンはブランクになる。
![]()
SQLステートメントがコンパイルされたSQL関数またはネイティブSQLプロシージャに埋め込まれている場合、この列は関数またはプロシージャのバージョン識別子を示します。 SQLステートメントが高度なトリガーの本文に埋め込まれている場合、この列は使用されず、空白になります。![]() |
| COLLID | varchar(128)notNULL、デフォルト | コレクションID:
|
| ACCESS_DEGREE | SMALLINT | 照会でアクティブになった並列タスクまたは操作の数。 この値はバインド時に 判別され、実行時の実際の並列操作数とは異なる可能性がある。 ホスト変数が使用される場合、この列は 0 になる。 43 列未満のプラン表を使用してプランまたはパッケージをバインドした場合、この列には NULL 値が入る。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| ACCESS_PGROUP_ID 2 | SMALLINT | 新規表にアクセスするときに使用する並列グループの ID。 並列グループとは、同じ数の並列タスクが含まれている連続操作のグループで、 並列に実行される。 この値はバインド時に決定され、実行時に変更される可能性があります。プランまたはパッケージが43列未満のプラン・テーブルを使用してバインドされた場合、この列にはNULL値が含まれます。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| JOIN_DEGREE | SMALLINT | 複合表と新規表を結合するときに使用する並列の操作またはタスクの数。 この値はバインド時に決定され、 ホスト変数が使用される場合は 0 になることがある。 実行時の実際の並列の操作またはタスクの数は、 それとは異なる可能性がある。 43 列未満のプラン表を使用してプランまたはパッケージをバインドした場合、この列には NULL 値が入る。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| JOIN_PGROUP_ID 2 | SMALLINT | 複合表と新規表を結合するときに使用する並列グループの ID。 この値はバインド時に判別され、実行時には値が異なることがある。 43 列未満のプラン表を使用してプランまたはパッケージをバインドした場合、この列には NULL 値が入る。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| SORTC_PG ROUP_ID3 | SMALLINT | 複合表の並列ソートのための 並列グループ ID。 43 列未満のプラン表を使用してプランまたはパッケージをバインドした場合、この列には NULL 値が入る。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| SORTN_PGROUP_ID3 | SMALLINT | 新規表の並列ソートのための並列グループ ID。 43 列未満のプラン表を使用してプランまたはパッケージをバインドした場合、この列には NULL 値が入る。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| 並列モード2 | CHAR(1) | バインド時に使用した並列処理がある場合、そのタイプ。
|
| MERGE_JOIN_COLS | SMALLINT | マージ・スキャン結合 (方式 2) で結合された列の数。 43 列未満のプラン表を使用してプランまたはパッケージをバインドした場合、この列には NULL 値が入る。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| CORRELATION_NAME | VARCHAR(128) | ステートメントで指定された表またはビューの相関名。 相関名が存在しない場合、この列は NULL になる。 43 列未満のプラン表を使用してプランまたはパッケージをバインドした場合、この列には NULL 値が入る。 それ以外の場合は、参照する方式が適用されなければ NULL が入る。 |
| PAGE_RANGE | CHAR(1) NOT NULL WITH DEFAULT | 表がページ範囲スクリーニングの条件を満たすかどうかの表示。
条件を満たしていれば、必要な表パーティション以外はスキャンする必要がない。
|
| JOIN_TYPE | CHAR(1) NOT NULL WITH DEFAULT | 結合のタイプ:
RIGHT OUTER JOIN は使用時に LEFT OUTER JOIN に変換されるので、 JOIN_TYPE は L になる。 |
| GROUP_MEMBER | varchar(24) not null with default | EXPLAINを実行した Db2 のメンバー名。 EXPLAINが実行された際に、 Db2 サブシステムがデータ共有環境になかった場合、この列は空白になります。 |
| IBM_SERVICE_DATA | VARCHAR(254) FOR BIT DATA | この列には、 IBM のみで使用される値が含まれています。 |
| WHEN_OPTIMIZE | CHAR(1) NOT NULL WITH DEFAULT | アクセス・パスが判別されている場合、以下を指定できます。
|
| QBLOCK_TYPE1 | CHAR(6) NOT NULL WITH DEFAULT | それぞれの照会ブロックに関して、実行された SQL 操作のタイプを示す。 最も外側のクエリでは、この列はステートメントの種類を識別します。 可能な値は以下の通りです。
|
| BIND_TIME | TIMESTAMP NOT NULL WITH DEFAULT | この列は推奨されません。 代わりに、EXPLAIN_TIME を使用してください。 |
| OPTHINT | VARCHAR(128) NOT NULL WITH DEFAULT | Db2 の最適化ヒントとしてこの行を識別するための文字列。 Db2 アクセスパスを選択する際に、この行を入力として使用します。 |
| HINT_USED | VARCHAR(128) NOT NULL WITH DEFAULT | 以下の値のいずれか。
![]()
![]() |
| PRIMARY_ACCESSTYPE | CHAR(1) NOT NULL WITH DEFAULT | 次のように、まず直接行アクセスを試行するかどうかを示します。
|
| PARENT_QBLOCKNO | SMALLINT NOT NULL WITH DEFAULT | 親照会ブロックの QBLOCKNO を示す番号。 |
| TABLE_TYPE | CHAR(1) | 新規の表のタイプ:
照会で、暗黙的なソートを必要とする GROUP BY、ORDER BY、または DISTINCT を使用する場合、この列の値は NULL になります。 |
| TABLE_ENCODE | CHAR(1) NOT NULL WITH DEFAULT | 表のコード化スキーム。 可能値は次のとおりです。
|
| TABLE_SCCSID | SMALLINT NOT NULL WITH DEFAULT | 表の SBCS CCSID 値。 列 TABLE_ENCODE が M の場合、この値は 0 です。 |
| TABLE_MCCSID | SMALLINT NOT NULL WITH DEFAULT | 表の混合 CCSID 値。 TABLE_ENCODE 列の値が M の場合、この値は 0 です。 アプリケーションのデフォルトのモジュールで MIXED=NO の場合、この値は -2 です。 |
| TABLE_DCCSID | SMALLINT NOT NULL WITH DEFAULT | 表の DBCS CCSID 値。 TABLE_ENCODE 列の値が M の場合、この値は 0 です。 アプリケーションのデフォルトのモジュールで MIXED=NO の場合、この値は -2 です。 |
| ROUTINE_ID | INTEGER NOT NULL WITH DEFAULT | この列の値は IBM 専用です。 |
| CTEREF | SMALLINT NOT NULL WITH DEFAULT | 参照される表が共通表式の場合、この値は、最上位照会ブロック番号です。 |
| STMTTOKEN | VARCHAR(240) | ユーザー指定ステートメント・トークン。 |
| PARENT_PLANNO | SMALLINT NOT NULL | 相関副照会が呼び出される親照会ブロックのプラン番号に相当します。 または、非相関副照会の場合は、副照会の作業ファイルを表す、親照会ブロック内のプラン番号に相当します。 |
| BIND_EXPLAIN_ONLY | CHAR(1) NOT NULL WITH DEFAULT | コマンドで EXPLAIN(ONLY) オプションを指定したために行が挿入されたかどうかを示します。 |
| SECTNOI | INTEGER NOT NULL WITH DEFAULT | ステートメントのセクション番号。 値は SYSPACKSTMT または SYSSTMT の表の同じ列から取得され、表を結合してそのステートメントのアクセス・パスを再構成するために使用することができる。 この列は静的ステートメントのみに適用される。 -1 のデフォルト値は、 DB2 9 またはそれ以前で取得されたEXPLAIN情報を示します。 |
| EXPLAIN_TIME | timestamp not null、デフォルト | EXPLAIN 情報が収集された時刻:
|
| MERGC | CHAR(1) NOT NULL WITH DEFAULT | 結合前に複合表が統合されるかどうかを示します。
|
| MERGN | CHAR(1) NOT NULL WITH DEFAULT | 新しいテーブルが結合前に連結されているか、またはデータパーティショニングされたセカンダリインデックス(DPSI)を使用したアクセスにマージ操作が関与しているかどうかを示します。
|
| SCAN_DIRECTION | CHAR(1) | 索引アクセスの場合、索引スキャンの方向は次のようになります。
|
| EXPANSION_REASON | CHAR(2) NOT NULL WITH DEFAULT | この列は、アーカイブ表またはテンポラル表を参照するステートメントのみに適用されます。 他のステートメントについては、この列はブランクです。 CURRENT TEMPORAL BUSINESS_TIME 特殊レジスター、CURRENT TEMPORAL SYSTEM_TIME 特殊レジスター、および SYSIBMADM.GET_ARCHIVE 組み込みのグローバル変数の効果を示します。 これらの項目は、BUSTIMESENSITIVE、SYSTIMESENSITIVE、および ARCHIVESENSITIVE バインド・オプションによって制御されます。 以下の条件のいずれかに該当する場合、Db2 は特定の構文を暗黙的に照会に追加します。
|
| 拡張理由 (続き) | この列は、次のいずれかの値を取ります。
|
|
PER_STMT_ID ![]() |
bigint not null ![]() |
Db2 カタログテーブル内のSQLステートメントの永続的なステートメント識別子。例えば、この列は、SQL ステートメントを識別する以下のカタログ表の列に対応します。
![]() |
AP_PLANID![]() |
CHAR(16) FOR BIT DATA![]() |
拡張タイムスタンプ値の形式で、SQL文のBINDまたはPREPARE最適化用の一意の識別子。![]() |
- ACCESSTYPE='A' および QBLOCK_TYPE='SELECT' が示されている PLAN_TABLE 行の場合、QUERYNO、APPLNAME、および PROGNAME を除く他のすべての列の値は、これらの列のデフォルト値です。
- 最適化ヒントに使用される行では、次の行に NULL 値があると、並列処理を使用しないヒントであることが示されます。
- PARALLELISM_MODE
- ACCESS_PGROUP_ID
- JOIN_PGROUP_ID
- 最適化ヒントに使用される行では、次の行に NULL 値があると、並列ソートを使用しないヒントであることが示されます。
- SORTN_PGROUP_ID
- SORTC_PGROUP_ID
- Db2 は、EXPLAIN(ONLY) オプションが指定され、アクセス・パスの再使用または比較が失敗する場合には、バインドまたは再バインドで REMARKS 列に値を挿入します。 この値には以下の情報が含まれている可能性があります。
- 再利用に失敗した際に SQLCODE +395 の理由コードに対応する理由コード
- 比較が失敗した、一致しない PLAN_TABLE 列の名前
ストリング「UNMATCHED ROW(S)」は、元のアクセス・パスの行に行が追加されているか、元のアクセス・パスよりも行が少ないことを示します。
再使用または比較の失敗の結果として REMARKS 列にある値は、すべてのアクセス・パスの相違を表すわけではありません。 REMARKS 値は、アクセス・パスの変更が許容できるかどうかを判別するためには不十分です。 これらは、アクセス・パスの変更方法の判別にさらに分析が必要となる可能性があること、また、変更によってそれ以上のアクションが必要になるかどうかを示します。
- Db2 は、選択度オーバーライドをステートメントに使用できないときに REMARKS 列に値を挿入します。 この値には、選択度のオーバーライドが使用されなかった理由を示す理由コードが含まれます。 この値には追加の診断情報が含まれる場合もあります。
コード値がSQLCODE +395 の理由コードに対応する理由:
- '1'-'41'
- 拡張最適化プロセスの一環として生成された最適化ヒントを適用できないことを示します。 単一の選択度インスタンスのみを使用してください。
- '42'
- 選択度のオーバーライドの構造が無効であることを示します。 選択度のオーバーライドを再度生成してください。
- '43'
- 選択度のオーバーライドは予期しないエラーのため適用できません。 それでも問題が解決しない場合は、 IBM サポートまでご連絡ください。
- '44'-'99'
- 拡張最適化プロセスの一環として生成された最適化ヒントを適用できないことを示します。 単一の選択度インスタンスのみを使用してください。
PLAN_TABLE_HINT_IX 索引
PLAN_TABLE_HINT_IX 索引は、アクセス・パス・ヒント使用時の準備パフォーマンスを向上させます。 この索引は、ステートメント・レベルのアクセス・パスおよび最適化パラメーターに必要です。 PLAN_TABLE アクセス・パス・ヒントの場合、PLAN_TABLE_HINT_IX 索引はオプションですが、使用することを強くお勧めします。
PLAN_TABLE_HINT_IX 索引を作成するステートメントは、SDSNSAMP ライブラリーの DSNTESC メンバーの一部として組み込まれています。