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

» 2005年03月24日 00時00分 公開
[荒井智也株式会社アゲハ]

外部表(駆動表)に絞り込み条件がある結合を含むSQLを実行する

 次に、WHERE条件によってある程度絞ったデータを結合する場合について見ていきます。ここでは「LINEITEM」表の「l_orderkey」列(主キーの一部)を検索条件に指定し、結合方法によってどのような違いが出るのかを見ていきたいと思います。

 図6では、検索条件を追加したSQLにて、ヒント文でネステッド・ループ結合の使用をオプティマイザに指示しています。

図6 検索条件を追加したネステッド・ループ結合の場合 図6 検索条件を追加したネステッド・ループ結合の場合

 図6の実行統計から、検索条件を加えたことで対象となる件数が減少し、また索引が効率よく使用されることで、図1と比べると実行時間、アクセスブロック数が大きく減少していることが確認できます。

 図7では、ヒント文でソート/マージ結合の使用をオプティマイザに指示しています。

図7 検索条件を追加したソート/マージ結合の場合 図7 検索条件を追加したソート/マージ結合の場合

 図7の実行統計では、「query」の値はネステッド・ループ結合に比べて小さくなっていますが、実行時間は長くなってしまっています。これは「LINEITEM」表の結合条件列である「l_suppkey」に索引が作成されていないことにより、この表に対するソート処理が発生しているためです。

 図8では、ヒント文でハッシュ結合の使用をオプティマイザに指示しています。

図8 検索条件を追加したハッシュ結合の場合 図8 検索条件を追加したハッシュ結合の場合

 図9は各結合方法による実行時間、アクセスブロック数の結果をグラフにしたものです。

図9 結合方法別の実行時間とアクセスブロック数 図9 結合方法別の実行時間とアクセスブロック数

 図9の結果より、アクセスブロック数ではハッシュ結合が一番少ないですが、実行時間においてはネステッド・ループ結合が一番速い結果となっていることが分かります。今回のような、外部表(駆動表)に絞り込み条件がある結合の場合には、ネステッド・ループ結合が最も適した結合方法であるといえます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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