管理の手引き


db2expln および dynexpln 出力の説明

出力では、各パッケージの Explain 情報が次の 2 つの部分に分かれます。

アクセス・プラン (つまりセクション) のステップは、 データベース・マネージャーが実行する順序で示されます。 それぞれの主なステップは、左寄せの見出しで示され、 そのステップに関する情報はその下に字下げして示されます。 アクセス・プランの Explain 出力には、 出力の左方マージンに字下げの棒線があります。 これらの棒線は操作の「有効範囲」を示します。すなわち、 同じ操作の中でもより下位の字下げレベルにある (さらに右側にずれている) 操作は、 すぐ上位にある字下げレベルに戻る前に処理されます。

選択されたアクセス・プランが元の SQL ステートメント (出力に表示されたステートメント) の増補されたものに基づいていることを思い出してください。 たとえば、元のステートメントがいくつものトリガーや制約を活動化するものである場合があります。 また、元の SQL ステートメントが、SQL コンパイラーの照会再書き込み構成要素によって、 同等ではあるものの、より効率的な形式に書き直されることもあります。 最適化プログラムがこのステートメントを満足させるのに最も効率的なプランを決める際には、 これらのすべての要素が情報として最適化プログラムに提供されます。 したがって、Explain 出力に示されるアクセス・プランが、 元の SQL ステートメントについて予期していたアクセス・プランとは本質的に異なってしまうという場合もあります。 統合化 Explain 機能 (第 26 章, SQL Explain 機能参照) は、 最適化に使用される実際の SQL ステートメントを、照会の内部表現を逆変換して作成し、 SQL のようなステートメントの形式で示します。

db2expln または dynexpln からの出力を、 Explain 機能の出力と比較するときに、 操作員 ID オプション (-i) は非常に便利です。 db2expln または dynexpln が、 Explain 機能から新しい操作員の処理を開始するたびに、 操作員 ID 番号が、Explain されるプランの左側に印刷されます。 操作員 ID は、異なる表示のアクセス・プランの中で、 ステップを突き合わせるために使用することができます。 Explain 機能の出力の中の操作員と、 db2expln および dynexpln によって示される操作の間が、 つねに 1 対 1 で対応しているわけではないことに注意してください。

以下の項目では、 db2expln および dynexpln によって作成される Explain テキストについて説明します。

表アクセス

このステートメントは、アクセスする表の名前とタイプを指定します。 使用できる形式には、次の 2 つがあります。

  1. 正規表には、以下の 3 つのタイプがあります。
  2. 一時表には、以下の 2 つのタイプがあります。

表アクセス・ステートメントに続いて、 アクセスを詳しく記述するためにさらにステートメントが提供されています。 これらのステートメントは、表アクセス・ステートメントの下に字下げされます。 可能なステートメントは、以下のとおりです。

列の数

次のステートメントは、表の各行から使用する列の数を示します。

   #Columns = n

並列走査

次のステートメントは、データベース・マネージャーがサブエージェントをいくつか使用して、 表から並列に読み取りをすることを示します。

   Parallel Scan

このテキストが示されない場合は、 表からの読み取りは 1 つのエージェント (またはサブエージェント) によってのみ行われます。

走査方向

次のステートメントは、データベース・マネージャーが列を逆順に読み取ることを示します。

   Scan Direction = Reverse

このテキストが示されていない場合は、走査方向は順方向で、これが省略時値です。

行アクセス方式

次のステートメントのうちの 1 つが表示されている場合、 表内の修飾行がアクセスされる方法を示します。

ロック意図

表アクセスのたびに、表および行レベルで獲得されるロックのタイプを、 次のステートメントを用いて表示することができます。

   Lock Intents
   |  Table: xxxx
   |  Row  : xxxx

表ロックに可能な値は、以下のとおりです。

行ロックに可能な値は、以下のとおりです。

これらのロック・タイプの解説は、ロックの属性にあります。

述部

アクセス・プランに用いられる述部に関する情報を提供するステートメントは、2 つあります。

  1. 次のステートメントは、一度データが戻されたときに、 述部の数が評価されることを示します。
       Residual Predicate(s)
       |  #Predicates = n
    
  2. 次のステートメントは、データ・アクセス中に、述部の数が評価されることを示します。 述部のカウントには、集約や分類などの後入れ先出し操作は含まれていません。
       Sargable Predicate(s)
       |  #Predicates = n
    

このステートメントに表示された述部の数は、 SQL ステートメント中の述部の数を反映していないことがあります。 なぜなら、述部は次のような場合があるからです。

その他の表ステートメント

一時表

一時表は、 アクセス・プランを実行中にデータを一時的な作業表に保管するために使用されます。 この表は、アクセス・プラン実行中にのみ存在します。 通常は、アクセス・プランの初期段階で副照会の評価が必要になったとき、 または中間結果が利用可能なメモリーに納まらないときに、 一時ファイルが使用されます。

一時表を作成することが必要になると、 2 つのステートメントのうちのどちらかが表示されることがあります。 これらのステートメントは、一時表を作成し、 その表に行が挿入されるように指示します。 ID は、一時表を参照するときの便宜上 db2expln によって割り当てられる識別子です。 この ID は、接頭部として文字 't' が付き、その表が一時表であることを示します。

上記のステートメントの後には、いずれも次の 1 行を付加することができます。

   #Columns = n

これは、一時表に挿入している各行を何列にするかを示します。

分類済みの一時表

次のような操作から、分類済みの一時表を作成することができます。

分類済みの一時表を作成するための元のステートメントの後に、 いくつかの追加ステートメントを付加することもできます。

一時表の完了

一時表を作成するための後入れ先出し操作を含む表アクセス (つまり、 表アクセスの有効範囲内で生じる一時表の作成) の後には、 「完了 (completion)」ステートメントがあります。 このステートメントは、 一時表がそれ以後の一時表アクセスで行を提供できるようにしておくことによって、 ファイルの終わりを処理します。 次の行のうち 1 つが表示されます。

   Temp Table Completion  ID = tn
   Shared Temp Table Completion  ID = tn
   Sorted Temp Table Completion  ID = tn
   Sorted Shared Temp Table Completion  ID = tn

表関数

表関数とは、 データを表の形式でステートメントに戻すユーザー定義関数 (UDF) のことです。 表関数についての詳細は、SQL 解説書 を参照してください。 表関数は次のステートメントによって示されます。

   Access User Defined Table Function
   |   Name = schema.funcname
   |   Language = xxxx
   |   Fenced   Deterministic   NULL Call   Disallow Parallel

表関数を書き込む際に使用する言語 (C、OLE、または Java) と、 表関数の属性を指定します。

結合

結合には 3 つのタイプがあります (これらの結合の説明については、 結合の概念を参照してください)。

結合セクションが実行される時になると、 以下のステートメントのうち 1 つが表示されます。

   Hash Join

または

   Merge Join

または

   Nested Loop Join

左方外部結合を行うこともできます。 左方外部結合は、下記のステートメントのいずれかで指示されます。

   Left Outer Hash Join

または

   Left Outer Merge Join

または

   Left Outer Nested Loop Join

マージ結合とネスト・ループ結合の場合、結合の外部表は、 出力に表示されている直前のアクセス・ステートメント内で参照される表です。 結合の内部表は、 結合ステートメントの有効範囲内にあるアクセス・ステートメントで参照される表です。 ハッシュ結合の場合、 逆に結合の有効範囲内のアクセス・ステートメントによって参照される表が外部表になり、 結合の前に表示されるアクセス・ステートメントによって参照される表が内部表になります。

ハッシュ結合とマージ結合の場合、次のような追加のステートメントが表示されます。

ハッシュ結合の場合、次のような追加のステートメントが表示されます。

ネストしたループ結合の場合、 次の追加ステートメントが結合ステートメントの直後に表示されます。

   Piped Inner

このステートメントは、結合の内部表が別の一連の操作の結果であることを示します。 これを、複合内部 ともいいます。

結合が 3 つ以上の表に関係する場合、Explain ステップは上から下に読みます。 たとえば、Explain 出力に次のような流れがあるとします。

   Access ..... W
   Join
   |  Access ..... X
   Join
   |  Access ..... Y
   Join
   |  Access ..... Z

この場合、実行ステップは次のようになります。

  1. W から修飾行を取り出す。
  2. W からの行を、X からの行 (次の行) と結合し、 結果 P1 (部分結合の結果番号 1) を呼び出す。
  3. P1Y からの行 (次の行) と結合して、 P2 を作成する。
  4. P2Z からの行 (次の行) と結合し、 1 つの完全結果行を入手する。
  5. さらに行が Z にあれば、ステップ 4 に戻る。
  6. さらに行が Y にあれば、ステップ 3 に戻る。
  7. さらに行が X にあれば、ステップ 2 に戻る。
  8. さらに行が W にあれば、ステップ 1 に戻る。

データ・ストリーム

アクセス・プラン内では、 ある一連の操作から別の一連の操作へとデータの作成と流れを制御することがしばしば必要になります。 データ・ストリームという概念を用いると、 あるアクセス・プラン内での一群の操作を 1 つの単位として制御することが可能になります。 データ・ストリームの先頭は、次のステートメントで示します。

   Data Stream n

ここで、n は、 参照を容易にするために db2expln によって割り当てられた固有の識別子です。 データ・ストリームの末尾は、次のステートメントで示します。

   End of Data Stream n

この 2 つのステートメントの間のすべての操作が、 同一のデータ・ストリームの一部とみなされます。

データ・ストリームにはいくつもの特性があり、 最初のデータ・ストリーム・ステートメントの後には 1 つまたは複数のステートメントに続けて、 それらの特性を記述することができます。

データ・ストリームがアクセスされると、 次のステートメントが出力に表示されます。

   Access Data Stream n

挿入、更新、および削除

これらの SQL ステートメントの Explain テキストは、解説するまでもありません。 これらの SQL 操作に使用可能なステートメント・テキストは、次のとおりです。

行識別子 (RID) の作成

一部のアクセス・プランでは、実際の表アクセスが実行される前に、 修飾行識別子 (RID) を分類しておき、重複を削除しておくか (index ORing の場合)、 またはアクセスされているすべての索引に出てくる RID を識別するための手法を使用すると (index ANDing の場合)、 効率がよくなります。 Explain ステートメントによって示される RID 作成には、主に 3 つの使用法があります。

どのタイプの RID 作成の場合でも、リスト事前取り出しを実行できる場合は、 次のステートメントを用いてそれが表示されます。

   Prefetch: Enabled

集約

集約は、SQL ステートメント述部によって指定される基準があれば、 その基準に合致する行で実行されます。 何らかの集約関数が実行されると、以下のステートメントのいずれかが表示されます。

   Aggregation
   Predicate Aggregation
   Partial Aggregation
   Partial Predicate Aggregation
   Intermediate Aggregation
   Intermediate Predicate Aggregation
   Final Aggregation
   Final Predicate Aggregation

述部集約とは、データに実際にアクセスするときに、 集約操作が後入れ先出し式に述部として処理されることを表します。

上述の集約ステートメントのいずれの場合もその下に、 実行される総計関数のタイプの指示があります。

特定の列関数は、元の SQL ステートメントから引き出すことができます。 単一のレコードは、MIN または MAX 演算の条件を満たす索引から取り出されます。

述部集約を使用すると、集約が示される表アクセス・ステートメントに続いて、 集約「完了」になります。これは、 各グループの完了またはファイルの終わりの際に必要とされる処理をすべて実行します。 次の行のうちのいずれかが表示されます。

   Aggregation Completion
   Partial Aggregation Completion
   Intermediate Aggregation Completion
   Final Aggregation Completion

並列処理

SQL ステートメントを並列で実行する場合 (区画内並行処理または区画間並行処理のいずれかを使用して) は、 特別な操作が必要になります。 並列プランの操作について、以下で説明します。

連合ステートメント処理

連合データベースで SQL ステートメントを実行する場合、 ほかのデータ・ソースに対してステートメントの部分を実行できなければなりません。

アクセスされるデータ・ソースは以下のように指示されます。

   Distributed Subquery #n
   |   #Columns = n

分散副照会から戻されるデータに述部に適用することができます。 適用される述部の数は、次のように指示されます。

   Residual Predicate(s)
   |   #Predicates = n

各分散副照会の詳細は、個別に指定されます。 分散副照会のオプションは、 以下のように記述されます。

その他のステートメント


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]