結合を含むSQLが実行されるとき、結合処理に時間がかかっていることは非常に多くあります。結合処理を排除できれば、当然その分だけ時間を短縮できるので、SQLのパフォーマンス向上が期待できます。Oracle9iからBITMAP JOIN INDEXを利用することで結合処理の排除が可能になります。BITMAP JOIN INDEXはその名のとおり、図7のようなイメージでデータをBitmapで管理しています。
この例で実行しているSQLは、結合条件以外にDNAME列にWHERE条件が存在することを前提としています。BITMAP JOIN INDEXを利用すると、DNAME列の条件に一致するEMP表のROWIDを取得することが可能になるため、DEPT表との結合処理が排除可能となります。
それでは、具体的にBITMAP JOIN INDEXを利用した場合とそうでない場合の違いについて、実行計画を見てみましょう。
<BITMAP JOIN INDEXを利用しない場合>
ディメンション表に当たるORDERS表、PART表のキー列にはプライマリキーを作成し、また、WHERE句の絞り込み条件列にも索引を作成しています。
<BITMAP JOIN INDEXを利用したSQL>
初めに以下のSQLで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.