表の結合を極めるチューニング・テクニックOracle SQLチューニング講座(10)(4/4 ページ)

» 2005年03月24日 00時00分 公開
[荒井智也株式会社アゲハ]
前のページへ 1|2|3|4       

内部表に絞り込み条件がある結合を含むSQLを実行する

 それでは、今度は内部表に絞り込み条件がある場合について見ていきます。上述の「外部表(駆動表)に絞り込み条件がある結合を含むSQLを実行する」で使用したSQLにおいて、FROM句に指定した表の順序を入れ替えた場合について考えてみましょう。ここでは、その違いを一番確認しやすいネステッド・ループ結合の場合について説明します。

 図10は「LINEITEM」表を、図11は「SUPPLIER」表をそれぞれ外部表とし、ネステッド・ループ結合することをオプティマイザに指示しています。

図10 「LINEITEM」表での絞り込み結果を「SUPPLIER」表に結合した場合 図10 「LINEITEM」表での絞り込み結果を「SUPPLIER」表に結合した場合
図11 「SUPPLIER」表を外部表として「LINEITEM」表に結合した場合 図11 「SUPPLIER」表を外部表として「LINEITEM」表に結合した場合

 図10、図11の実行統計を比べると、内部表に絞り込み条件があった場合の方が、実行時間、アクセスブロック数ともに非常に多くなっていることが確認できます。

 図12は、絞り込み条件を外部表、内部表で行った場合の実行時間、アクセスブロック数の結果をグラフにしたものです。

図12 絞り込みを行う表別の実行時間とアクセスブロック数 図12 絞り込みを行う表別の実行時間とアクセスブロック数

 図12の結果から、ネステッド・ループ結合の場合には、適切な表を外部表とすることが非常に重要であることが分かります。外部表を決定する際は、表全体のレコード件数で判断するのではなく、結合条件以外のWHERE句で、より絞り込まれる方を外部表にすべきであるという点に注意してください。

まとめ

 表1は、実行される検索のパターン別にどの結合方法がよいかをマトリックス表にしたものです。

結合する表の
パターン
結合方式
ネステッド・ループ結合 ソート/マージ結合 ハッシュ結合
件数の多い表同士を結合し、全レコード出力する 不向き 結果を結合列でソートして出力する場合に有効。双方の結合列にNOT NULL制約が指定されており、索引が存在する場合、非常に効率的 システム・リソースに余裕がある場合には最適
一方の表に絞り込み条件を指定して表を結合し、少数のレコードを出力する 目安として索引を使用して表の15%以内の絞り込みであれば最適 不向き 目安として索引を使用して表の15%以上の絞り込みで、なおかつ等価条件があれば使用を検討
表1 結合方式と検索パターン一覧

 表1からも分かるように、結合条件が等価条件でないためにハッシュ結合を行えない場合以外は、大量の結合処理では、まずハッシュ結合を検討すべきです。


 次回も結合に関するチューニングについて紹介します。


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。