新インデックスの検証 その6

投稿日: 2002年11月20日

<新インデックスの検証 その6> ペンネーム モンキーターン

今回は、Functionインデックスの検証を行なう。
Functionインデックスが、どのような場合に有効に使えるものなのかを検証する。

Oracle8iから、Functionインデックスが導入されたことで、式を含む条件の評
価にインデックスを利用できるようになった。それでは、その性能を検証して
みよう。

検証スタート!!!

SQL> select empno, ename from emp_200man2 where empno*(sal-100)  create index func_idx on emp_200man2(empno*(sal-100)) ;
create index fun_idx on emp_200man2(empno*(sal-100))
                                               *
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています。

あれれれー。エラー発生!!!

Functionインデックスを作成するには権限が必要である。
QUERY REWRITE権限である。( 他のスキーマ内で作成する場合は、GLOBAL QUERY
REWRITE権限 )

それでは、scottユーザに権限を与えて、再度作成してみよう。

SQL> conn system/manager
接続されました。
SQL> grant query rewrite to scott ;

権限付与が成功しました。

SQL> conn scott/tiger
接続されました。
SQL> create index func_idx on emp_200man2(empno*(sal-100)) ;

索引が作成されました。

作成時間 = 1分52.09秒

ちなみに、Functionインデックスではない Normalインデックスは

SQL> create index normal_idx on emp_200man2(empno, sal) ;

作成時間 = 1分04.04秒

これで、O.K!Functionインデックスを作成することができた。
簡単な計算式程度なら、Functionインデックス作成時間にほとんど影響はない
が、式が複雑になればなるほど、Functionインデックスの作成時間は延びるの
である。これだけでは、Functionインデックスを使うことはできない。
Functionインデックスを使用するには、初期化パラメータ

query_rewrite_enabled = true
query_rewrite_integrity = trusted か stale_tolerated

である必要がある。

* query_rewrite_integrityは、Functionインデックスが使用している関数が
ユーザ定義のものでなければ、この設定は必要ない。デフォルト値は、
enforcedなのでユーザ定義関数を使用する場合は、明示的に変更が必要であ
る。今回は、ユーザ定義関数を使用していないため、この初期化パラメータ
は変更しない。

SQL> conn system/manager
接続されました。
SQL> select name, value from v$parameter where name like 'QUERY%' ;

レコードが選択されませんでした。

SQL> select name, value from v$parameter where name like 'query%' ;

NAME
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
query_rewrite_enabled
FALSE

query_rewrite_integrity
enforced

SQL> alter system set query_rewrite_enabled=TRUE ;

システムが変更されました。

これで、Functionインデックスを使用することが可能となった。

今回は、Functionインデックスを使用する場合の前提条件について説明した。
次回は、実際にFunctionインデックスを使用した場合の検証を行なう。

次回もお楽しみに・・・つづく

以上 ASIMO(ヒューマノイドロボット)と2ショット写真を取った
茅ヶ崎にて