索引の使い分けでパフォーマンスを向上できるケースOracle SQLチューニング講座(9)(1/4 ページ)

本連載では、Oracleデータベースのパフォーマンス・チューニングの中から、特にSQLのチューニングに注目して、実践レベルの手法を解説する。読者はOracleデータベースのアーキテクチャを理解し、運用管理の実務経験を積んでいることが望ましい。対象とするバージョンは現状で広く使われているOracle9iの機能を基本とするが、Oracle 10gで有効な情報も随時紹介していく。(編集局)

» 2005年02月19日 00時00分 公開
[倉田寛正株式会社アゲハ]
「連載:Oracle SQLチューニング講座」のインデックス

連載目次

 前回「複合索引(コンポジット索引)が有効なケース」は、コンポジット索引を有効利用するためのチューニング・テクニックを説明しました。Oracleにはいままでに紹介した以外にも、さまざまな状況に応じて使用できる索引が用意されています。今回はそれらの索引の使用場面や特徴について説明します。

ファンクション・ベース索引の使用

 Oracle8iから利用できるファンクション・ベース索引では、関数や式の値が事前に計算され、その結果が索引内に格納されています。そのため、WHERE句で指定した索引列が関数や算術で修飾されて索引を使用できないケースにおいても、このファンクション・ベース索引を利用することで索引スキャンが可能になります(詳しくは、第7回「索引を使用できないケース」を参照)。

 ファンクション・ベース索引を使用するためには、以下の設定を行うか、SQL中に明示的にHINT句を指定する必要があります。

  1. 初期化パラメータ「QUERY_REWRITE_ENABLED=TRUE」、初期化パラメータ「QUERY_REWRITE_INTEGRITY=ENFORCED」注1
  2. 初期化パラメータ「COMPATIBLE」が8.1以上
  3. 索引が作成された表の統計情報が取得され、コストベースのアプローチを使用する

注1初期化パラメータ 

SQL関数を使用したファンクション・ベース索引の場合には、デフォルト値(ENFORCED)でも使用できます。しかし、ユーザー定義関数を使用したファンクション・ベース索引の場合には、「QUERY_REWRITE_INTEGRITY=TRUSTED」と設定した場合のみ使用できます。


 図1は、ファンクション・ベース索引の作成例、および作成後の確認方法となります。

図1 ファンクション・ベース索引の作成、確認方法 図1 ファンクション・ベース索引の作成、確認方法

 それでは、実際にWHERE句の索引列が関数によって修飾されているSQLで、ファンクション・ベース索引を使用した場合とそうでない場合での実行統計、実行計画を比較してみましょう。

図2 通常のB*Tree索引は使用されずに全表スキャンされた場合 図2 通常のB*Tree索引は使用されずに全表スキャンされた場合
図3 ファンクション・ベース索引を使用した場合 図3 ファンクション・ベース索引を使用した場合

 図3では、ヒント文でファンクション・ベース索引を使用するようにオプティマイザに指示しています。実行計画から、WHERE句の条件列が算術によって修飾されているにもかかわらず、ファンクション・ベース索引による索引スキャンが実施されていることが確認できます。また、実行時間、アクセスブロック数も大きく減少していることが分かります。冒頭でも記述したように、関数などによる負荷の高い計算処理結果がすでに索引に格納されているため、検索処理のパフォーマンスを大きく改善できる可能性があります。

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

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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