それでは、今度は内部表に絞り込み条件がある場合について見ていきます。上述の「外部表(駆動表)に絞り込み条件がある結合を含むSQLを実行する」で使用したSQLにおいて、FROM句に指定した表の順序を入れ替えた場合について考えてみましょう。ここでは、その違いを一番確認しやすいネステッド・ループ結合の場合について説明します。
図10は「LINEITEM」表を、図11は「SUPPLIER」表をそれぞれ外部表とし、ネステッド・ループ結合することをオプティマイザに指示しています。
図10、図11の実行統計を比べると、内部表に絞り込み条件があった場合の方が、実行時間、アクセスブロック数ともに非常に多くなっていることが確認できます。
図12は、絞り込み条件を外部表、内部表で行った場合の実行時間、アクセスブロック数の結果をグラフにしたものです。
図12の結果から、ネステッド・ループ結合の場合には、適切な表を外部表とすることが非常に重要であることが分かります。外部表を決定する際は、表全体のレコード件数で判断するのではなく、結合条件以外のWHERE句で、より絞り込まれる方を外部表にすべきであるという点に注意してください。
表1は、実行される検索のパターン別にどの結合方法がよいかをマトリックス表にしたものです。
結合する表の パターン |
結合方式 | ||
ネステッド・ループ結合 | ソート/マージ結合 | ハッシュ結合 | |
件数の多い表同士を結合し、全レコード出力する | 不向き | 結果を結合列でソートして出力する場合に有効。双方の結合列にNOT NULL制約が指定されており、索引が存在する場合、非常に効率的 | システム・リソースに余裕がある場合には最適 |
一方の表に絞り込み条件を指定して表を結合し、少数のレコードを出力する | 目安として索引を使用して表の15%以内の絞り込みであれば最適 | 不向き | 目安として索引を使用して表の15%以上の絞り込みで、なおかつ等価条件があれば使用を検討 |
表1 結合方式と検索パターン一覧 |
表1からも分かるように、結合条件が等価条件でないためにハッシュ結合を行えない場合以外は、大量の結合処理では、まずハッシュ結合を検討すべきです。
次回も結合に関するチューニングについて紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.