出力では、各パッケージの 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 つがあります。
Access Table Name = schema.name ID = ts,nここで、
Access Hierarchy Table Name = schema.name ID = ts,nここで、
Access Summary Table Name = schema.name ID = ts,nここで、
Access Temp Table ID = tnここで、
Access Global Temp Table ID = ts,tnここで、
表アクセス・ステートメントに続いて、 アクセスを詳しく記述するためにさらにステートメントが提供されています。 これらのステートメントは、表アクセス・ステートメントの下に字下げされます。 可能なステートメントは、以下のとおりです。
次のステートメントは、表の各行から使用する列の数を示します。
#Columns = n
次のステートメントは、データベース・マネージャーがサブエージェントをいくつか使用して、 表から並列に読み取りをすることを示します。
Parallel Scan
このテキストが示されない場合は、 表からの読み取りは 1 つのエージェント (またはサブエージェント) によってのみ行われます。
次のステートメントは、データベース・マネージャーが列を逆順に読み取ることを示します。
Scan Direction = Reverse
このテキストが示されていない場合は、走査方向は順方向で、これが省略時値です。
次のステートメントのうちの 1 つが表示されている場合、 表内の修飾行がアクセスされる方法を示します。
Relation Scan | Prefetch: None
Relation Scan | Prefetch: n Pages
Relation Scan | Prefetch: Eligible
Index Scan: Name = schema.name ID = xx | Index Columns:
ここで、
その後には、索引の列ごとに 1 つの行が続きます。 索引の各列は、以下のいずれかの形式でリストされます。
n: column_name (Ascending) n: column_name (Descending) n: column_name (Include Column)
次のステートメントは、索引走査のタイプを明確にするために提供されています。
#Key Columns = n | Start Key: xxxxx | Stop Key: xxxxx
ここで、xxxxx は以下のいずれかに該当します。
索引走査には、包括キー値が含まれます。 走査に排他キー値は含まれません。 キーの値は、キーの各部を構成する以下の行のいずれかによって指定されます。
n: 'string' n: nnn n: yyyy-mm-dd n: hh:mm:ss n: yyyy-mm-dd hh:mm:ss.uuuuuu n: NULL n: ?
リテラル・ストリングが示される場合は、最初の 20 文字だけが表示されます。 ストリングの長さが 20 文字を超える場合、ストリングの終わりには ... が示されます。 キーによっては、セクションが実行されるまで判別できないものがあります。 その場合は、値として ? が示されます。
必要なすべての列が索引キーから入手できる場合、 このステートメントが表示され、表データにはアクセスしません。
Index Prefetch: None
Index Prefetch: Eligible
Data Prefetch: None
Data Prefetch: Eligible
Sargable Index Predicate(s) | #Predicates = n
表アクセスのたびに、表および行レベルで獲得されるロックのタイプを、 次のステートメントを用いて表示することができます。
Lock Intents | Table: xxxx | Row : xxxx
表ロックに可能な値は、以下のとおりです。
行ロックに可能な値は、以下のとおりです。
これらのロック・タイプの解説は、ロックの属性にあります。
アクセス・プランに用いられる述部に関する情報を提供するステートメントは、2 つあります。
Residual Predicate(s) | #Predicates = n
Sargable Predicate(s) | #Predicates = n
このステートメントに表示された述部の数は、 SQL ステートメント中の述部の数を反映していないことがあります。 なぜなら、述部は次のような場合があるからです。
Single Record
Isolation Level: xxxxさまざまな理由により、異なる分離レベルを使用することも可能です。 その理由としては、以下のことが挙げられます。
Keep Rows In Private Memory
Volatile Cardinality
一時表は、 アクセス・プランを実行中にデータを一時的な作業表に保管するために使用されます。 この表は、アクセス・プラン実行中にのみ存在します。 通常は、アクセス・プランの初期段階で副照会の評価が必要になったとき、 または中間結果が利用可能なメモリーに納まらないときに、 一時ファイルが使用されます。
一時表を作成することが必要になると、 2 つのステートメントのうちのどちらかが表示されることがあります。 これらのステートメントは、一時表を作成し、 その表に行が挿入されるように指示します。 ID は、一時表を参照するときの便宜上 db2expln によって割り当てられる識別子です。 この ID は、接頭部として文字 't' が付き、その表が一時表であることを示します。
Insert Into Temp Table ID = tn
Insert Into Shared Temp Table ID = tn
Insert Into Sorted Temp Table ID = tn
Insert Into Sorted Shared Temp Table ID = tn
Insert Into Global Temp Table ID = ts,tn
Insert Into Shared Global Temp Table ID = ts,tn
Insert Into Sorted Global Temp Table ID = ts,tn
Insert Into Sorted Shared Global Temp Table ID = ts,tn
上記のステートメントの後には、いずれも次の 1 行を付加することができます。
#Columns = n
これは、一時表に挿入している各行を何列にするかを示します。
次のような操作から、分類済みの一時表を作成することができます。
分類済みの一時表を作成するための元のステートメントの後に、 いくつかの追加ステートメントを付加することもできます。
#Sort Key Columns = n
分類キー中の列ごとに、次の行のうち 1 つが表示されます。
Key n: column_name (Ascending) Key n: column_name (Descending) Key n: (Ascending) Key n: (Descending)
Sortheap Allocation Parameters: | #Rows = n | Row Width = n
Sort Limited To Estimated Row Count
Use Partitioned Sort Use Shared Sort Use Replicated Sort Use Round-Robin Sort
各種の分類技法についての説明は、並列分類の方式を参照してください。
Piped
および
Not Piped
パイプ分類が指示されている場合は、データベース・マネージャーは、分類の出力をメモリーに保管して、 分類結果を別の一時表には入れません。 (パイプ分類と非パイプ分類の説明については、 最適化プログラムでの分類の影響を参照してください。)
Duplicate Elimination
Partial Aggregation Intermediate Aggregation Buffered Partial Aggregation Buffered Intermediate Aggregation
一時表を作成するための後入れ先出し操作を含む表アクセス (つまり、 表アクセスの有効範囲内で生じる一時表の作成) の後には、 「完了 (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
マージ結合とネスト・ループ結合の場合、結合の外部表は、 出力に表示されている直前のアクセス・ステートメント内で参照される表です。 結合の内部表は、 結合ステートメントの有効範囲内にあるアクセス・ステートメントで参照される表です。 ハッシュ結合の場合、 逆に結合の有効範囲内のアクセス・ステートメントによって参照される表が外部表になり、 結合の前に表示されるアクセス・ステートメントによって参照される表が内部表になります。
ハッシュ結合とマージ結合の場合、次のような追加のステートメントが表示されます。
Early Out: Single Match Per Outer Row
Residual Predicate(s) | #Predicates = n
ハッシュ結合の場合、次のような追加のステートメントが表示されます。
Process Hash Table For Join
Process Probe Table For Hash Join
Estimated Build Size: n
Estimated Probe Size: n
ネストしたループ結合の場合、 次の追加ステートメントが結合ステートメントの直後に表示されます。
Piped Inner
このステートメントは、結合の内部表が別の一連の操作の結果であることを示します。 これを、複合内部 ともいいます。
結合が 3 つ以上の表に関係する場合、Explain ステップは上から下に読みます。 たとえば、Explain 出力に次のような流れがあるとします。
Access ..... W Join | Access ..... X Join | Access ..... Y Join | Access ..... Z
この場合、実行ステップは次のようになります。
アクセス・プラン内では、 ある一連の操作から別の一連の操作へとデータの作成と流れを制御することがしばしば必要になります。 データ・ストリームという概念を用いると、 あるアクセス・プラン内での一群の操作を 1 つの単位として制御することが可能になります。 データ・ストリームの先頭は、次のステートメントで示します。
Data Stream n
ここで、n は、 参照を容易にするために db2expln によって割り当てられた固有の識別子です。 データ・ストリームの末尾は、次のステートメントで示します。
End of Data Stream n
この 2 つのステートメントの間のすべての操作が、 同一のデータ・ストリームの一部とみなされます。
データ・ストリームにはいくつもの特性があり、 最初のデータ・ストリーム・ステートメントの後には 1 つまたは複数のステートメントに続けて、 それらの特性を記述することができます。
Correlated
Pipedおよび
Not Piped
一時表の場合にそうであったように、パイプ・データ・ストリームも、 実行時にメモリーが十分になければディスクに書き込むことができます。 アクセス・プランでは、いずれの場合にも対応できるようになっています。
Single Record
データ・ストリームがアクセスされると、 次のステートメントが出力に表示されます。
Access Data Stream n
これらの SQL ステートメントの Explain テキストは、解説するまでもありません。 これらの SQL 操作に使用可能なステートメント・テキストは、次のとおりです。
一部のアクセス・プランでは、実際の表アクセスが実行される前に、 修飾行識別子 (RID) を分類しておき、重複を削除しておくか (index ORing の場合)、 またはアクセスされているすべての索引に出てくる RID を識別するための手法を使用すると (index ANDing の場合)、 効率がよくなります。 Explain ステートメントによって示される RID 作成には、主に 3 つの使用法があります。
Index ORing RID Preparation
Index ORing は、複数の索引アクセスを作成し、 その結果を結合して、アクセスされるいずれの索引にも出てくる別個の RID を組み込む技法を指します。 OR キーワードにより述部が接続される場合や、IN 述部がある場合に、 最適化プログラムは索引の OR を考慮します。 索引アクセスは、同一の索引または別々の索引に作成できます。
List Prefetch RID Preparation
Index ANDing
最適化プログラムが結果のセットのサイズを算定した場合は、 下記のステートメントによって算定結果が示されます。
Optimizer Estimate of Set Size: n
Index ANDing フィルター操作は、RID を処理し、 ビット・フィルター手法を使用して、 アクセスされるすべての索引に出てくる RID を判別します。 下記のステートメントは、index ANDing 用に RID が処理されていることを示します。
Index ANDing Bitmap Build Index ANDing Bitmap Probe Index ANDing Bitmap Build and Probe
最適化プログラムがビットマップ用に結果のセットのサイズを算定した場合は、 次のステートメントによって算定結果が示されます。
Optimizer Estimate of Set Size: n
どのタイプの 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 ステートメントを並列で実行する場合 (区画内並行処理または区画間並行処理のいずれかを使用して) は、 特別な操作が必要になります。 並列プランの操作について、以下で説明します。
Process Using n Subagents
サブセクションの分配は、次のステートメントによって指示されます。
Distribute Subsection #n
サブセクションを受け取るノードは、 以下の 8 つの方法のいずれかで判別することができます。
Directed by Hash | #Columns = n | Partition Map ID = n, Nodegroup = ngname, #Nodes = n
Directed by Node Number
Directed by Partition Number | Partition Map ID = n, Nodegroup = ngname, #Nodes = n
Directed by Position
Directed to Single Node | Node Number = n
Directed to Coordinator Node
Broadcast to Node List | Nodes = n1, n2, n3, ...
Directed to Any Node
Insert Into Synchronous Table Queue ID = qn Insert Into Asynchronous Table Queue ID = qn Insert Into Synchronous Local Table Queue ID = qn Insert Into Asynchronous Local Table Queue ID = qn
Broadcast to Coordinator Nodeすべての行が調整プログラム・ノードに送られます。
Broadcast to All Nodes of Subsection n指定のサブセクションが実行されているすべてのデータベース区画に、すべての行が送られます。
Hash to Specific Node行にある値に基づいて、各行がデータベース区画に送られます。
Send to Specific Nodeステートメントが実行されている間に、各行が決定されたデータベース区画に送られます。
Send to Random Node各行がランダム・データベース区画に送られます。
Rows Can Overflow to Temporary Table
Insert Into Synchronous Table Queue Completion ID = qn Insert Into Asynchronous Table Queue Completion ID = qn Insert Into Synchronous Local Table Queue Completion ID = qn Insert Into Asynchronous Local Table Queue Completion ID = qn
Access Table Queue ID = qn Access Local Table Queue ID = qnこれらのメッセージの後には常に、検索される列の数の表示が付いています。
#Columns = n
Output Sorted Output Sorted and Uniqueこれらのメッセージの後には、分類操作に使用されるキーの数の表示が付いています。
#Key Columns = n分類キー中の列ごとに、次のうち 1 つが表示されます。
Key n: (Ascending) Key n: (Descending)
Residual Predicate(s) | #Predicates = n
Jump Back to Start of Subsection
連合データベースで SQL ステートメントを実行する場合、 ほかのデータ・ソースに対してステートメントの部分を実行できなければなりません。
アクセスされるデータ・ソースは以下のように指示されます。
Distributed Subquery #n | #Columns = n
分散副照会から戻されるデータに述部に適用することができます。 適用される述部の数は、次のように指示されます。
Residual Predicate(s) | #Predicates = n
各分散副照会の詳細は、個別に指定されます。 分散副照会のオプションは、 以下のように記述されます。
Server: server_name (type, version) Server: server_name (type) Server: server_name
Subquery SQL Statement: statement
Nickname Referenced: Schema.nickname Base = baseschema.basetable
#Input Columns: n
#Output Columns: n
DDL StatementDDL ステートメントには、そのほかに Explain 出力はありません。
SET StatementSET ステートメントには、そのほかに Explain 出力はありません。
Distinct Filter #Columns = nここで、n は、入手している個別行に含まれる列の数です。 個別行の値を検索するには、重複値をスキップできるように行を順序付ける必要があります。 データベース・マネージャーが明示的に重複を除去する必要がなければ、 このステートメントは表示されません。以下のような場合があります。
Positioned Operationこのステートメントは、 WHERE CURRENT OF 構文を使用する SQL ステートメントに使われます。
Residual Predicate Application | #Predicates = n
UNION
Table Constructor | n-Row(s)表構成プログラムを使用して、1 つの集合として存在している値を一連の行に変形し、 後続の操作に渡すことができます。 表構成プログラムを次の行に入力するよう要求されると、次のステートメントが表示されます。
Access Table Constructor
Conditional Evaluation | Condition #n: | | #Predicates = n | Action #n:条件付き評価は、SQL CASE ステートメントなどの活動や、 参照保全制約やトリガーなどの内部機構を実行するときに使用します。 処置に何も示されていない場合は、条件が真であるときにのみデータ操作命令が処理されます。
Establish Row Position
Return Data to Application | #Columns = n操作が表アクセスに後入れ先出しされる場合、完了フェーズが必要になります。 このフェーズは、次のように表示されます。
Return Data Completion