Oracle8iまで、複合索引を利用させるためには、複合索引の先頭列がWHERE句の条件列に含まれている必要がありました。そのため、さまざまな検索パターンが存在する場合には、索引スキャンを行わせるために複数の複合索引を作成することになり、その結果、更新などのパフォーマンスに悪影響を及ぼしてしまうことがありました。
Oracle9iからは索引スキップ・スキャン機能により、索引内の先頭列がWHERE句の条件列に含まれていなくても、その複合索引を使用することが可能になりました。索引スキップ・スキャン機能を利用することで、表に作成する複合索引の個数を少なくできるため、表に対する更新処理のパフォーマンス劣化を抑えることが可能になります。
それでは、以下のように「l_shipmode」列が先頭である複合索引を使用して、索引スキップ・スキャンの動作を確認してみましょう。
「INDEX_SS」ヒントを使用して索引スキップ・スキャンをオプティマイザに指示し、WHERE句の条件列には索引の先頭列が含まれていないことに注目して、SQLトレース、TKPROFユーティリティを使用して実行計画を取得します。
図10の実行計画から、複合索引の先頭「l_shipmode」列が含まれていなくても、「idx2_lineitem」索引が索引スキップ・スキャンによって使用されていることが確認できます。
複合索引の有効利用は、検索性能を向上させるうえで、利用できる機会が多くある非常に重要なテクニックですので、ぜひトライしてみてください。次回は、引き続き索引を使用したチューニング・テクニックを紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.