連載
» 2005年04月21日 00時00分 公開

Oracle SQLチューニング講座(11):Oracleの機能を使って表の結合を高速化する (3/4)

[亀田明裕,株式会社アゲハ]

BITMAP JOIN INDEXを使用する

 結合を含むSQLが実行されるとき、結合処理に時間がかかっていることは非常に多くあります。結合処理を排除できれば、当然その分だけ時間を短縮できるので、SQLのパフォーマンス向上が期待できます。Oracle9iからBITMAP JOIN INDEXを利用することで結合処理の排除が可能になります。BITMAP JOIN INDEXはその名のとおり、図7のようなイメージでデータをBitmapで管理しています。

図7 Bitmap Indexイメージ 図7 Bitmap Indexイメージ

 この例で実行しているSQLは、結合条件以外にDNAME列にWHERE条件が存在することを前提としています。BITMAP JOIN INDEXを利用すると、DNAME列の条件に一致するEMP表のROWIDを取得することが可能になるため、DEPT表との結合処理が排除可能となります。

 それでは、具体的にBITMAP JOIN INDEXを利用した場合とそうでない場合の違いについて、実行計画を見てみましょう。

<BITMAP JOIN INDEXを利用しない場合>

 ディメンション表に当たるORDERS表、PART表のキー列にはプライマリキーを作成し、また、WHERE句の絞り込み条件列にも索引を作成しています。

図8 BITMAP JOIN INDEXを使用しない場合の実行計画 図8 BITMAP JOIN INDEXを使用しない場合の実行計画(画面をクリックすると拡大します)

<BITMAP JOIN INDEXを利用したSQL>

 初めに以下のSQLでBITMAP JOIN INDEXを作成します。

図9 BITMAP JOIN INDEXを使用した場合の実行計画 図9 BITMAP JOIN INDEXを使用した場合の実行計画(画面をクリックすると拡大します)

 図8と図9の実行計画を比較すると、BITMAP JOIN INDEXを作成することで、BITMAP JOIN INDEXへのレンジスキャンが行われ、結合処理が排除されていることが確認できます。このようにBITMAP JOIN INDEXを利用して結合処理を排除することができますが、SELECTリストにディメンション表の列が含まれていると結合処理が必要になってしまいます。これは、BITMAP JOIN INDEXが返すROWIDは索引を作成したファクト表になるためです。そのため、SELECTリストを参照し、結合が完全に排除できるか確認する必要があります。

 また、単一で作成できるBitmapインデックスと同様に更新時のロック単位はレコードでなく、Bitmapセグメント単位になります。そのため、OLTP系のような更新トランザクションが多数実行される環境では、BITMAP JOIN INDEXの使用には十分なテストが必要となります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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