9 付録
9.2 索引作成DDL
Oracle Textを使ったCTXXPATH索引と CONTEXT索引の作成方法を紹介しま す。
9.2.1 CTXXPATH索引の設定
existsNode 関数専用の索引で、XPath 式で問い合わせた要素の存在有無をチェ ックします。他の索引と合わせて使うこともできます。
SQL> CREATE INDEX ix_step1c 2 ON step1(object_value)
3 INDEXTYPE IS CTXSYS.CTXXPATH;
リスト9-5 CTXXPATH索引の作成
XML 要 素 を 特 定 し な い で 作 成 す る 索 引 な の で 、XMLType 表 は 擬 似 列 、 XMLType列は列名を指定します。
SQL> EXEC DBMS_STATS.GATHER_INDEX_STATS('ユーザー名','IX_STEP1C', null,null);
リスト9-6 統計情報の収集
‘サービス/@CODE’の要素内容が’G2456’である XML 文書を検索し、’/申込 /@NO’を表示させます。
SQL> SELECT extractValue(object_value,'/申込/@NO') 2 FROM step1
3 WHERE existsNode(object_value,
4 '/申込/サービス[@CODE="G2456"]') = 1;
EXTRACTVALUE(OBJECT_VALUE,'/申込/@NO')
---000123
リスト9-7 existsNode関数を使った問合せ
---
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---
| 0 | SELECT STATEMENT | | 1 | 2036 | 0 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| STEP1 | 1 | 2036 | 0 (0)| 00:00:01 |
|* 2 | DOMAIN INDEX | IX_STEP1C | | | 0 (0)| 00:00:01 | ---
リスト9-8 実行計画の確認
CTXXPATH索引は、定期的に索引の同期化と最適化処理が必要です。
SQL> EXEC CTX_DDL.SYNC_INDEX('IX_STEP1C', '1M');
リスト9-9 CONTEXT索引の同期化例
SQL> EXEC CTX_DDL.OPTIMIZE_INDEX('IX_STEP1C', 'FULL');
リスト9-10 CONTEXT索引の最適化
9.2.2 CONTEXT索引の設定
全文検索を行いたいときに作成します。他の索引と合わせて使うこともできま す。CONTEXT 索引を作成する前に、セクション・グループやプリファレンスを 設定しておく必要があります。詳細は『Oracle Text アプリケーション開発者ガイ ド』を参照してください。
ここでは、索引を日本語で検索できるようにし、XML 要素の内容や属性を意 識した問い合わせを行うので、以下の設定をします。
SQL> BEGIN
2 CTX_DDL.CREATE_SECTION_GROUP('MY_GROUP',
3 'PATH_SECTION_GROUP');
4 CTX_DDL.CREATE_PREFERENCE('MY_LEXER','JAPANESE_VGRAM_LEXER');
5 END;
6 /
リスト9-11 セクション・グループとプリファレンスの設定
SQL> CREATE INDEX ix_step1d ON step1(object_value) 2 INDEXTYPE IS CTXSYS.CONTEXT
3 PARAMETERS ('FILTER CTXSYS.NULL_FILTER 4 LEXER MY_LEXER
5 SECTION GROUP MY_GROUP');
リスト9-12 CONTEXT索引の作成
XML 要 素 を 特 定 し な い で 作 成 す る 索 引 な の で 、XMLType 表 は 擬 似 列 、 XMLType列は列名を指定します。
SQL> EXEC DBMS_STATS.GATHER_INDEX_STATS('ユーザー名','IX_STEP1D', null,null);
リスト9-13 統計情報の収集
CONTEXT 索引を作成することで、3 種類の構造演算子を使用した問合せが可 能になります。
WITHIN演算子:XML要素に限定した問い合わせを実行します INPATH演算子:XML構造を使用した問合せを実行します HASPATH演算子:パスを使用した問合せを実行します
WITHIN演算子
‘サービス名’要素に’サポート’という文字列を含んでいる XML 文書を検索 し、’/申込/@NO’を表示させます。
SQL> SELECT extractValue(object_value,'/申込/@NO') 2 FROM step1
3 WHERE CONTAINS(object_value,'サポート WITHIN サービス名') > 0;
EXTRACTVALUE(OBJECT_VALUE,'/申込/@NO')
---000123
リスト9-14 WITHIN演算子を使った問合せ例
INPATH演算子
‘/申込/契約者’の要素に’オラクル’という文字列を含んでいる XML 文書を検索 し、’/申込/@NO’を表示させます。
SQL> SELECT extractValue(object_value,'/申込/@NO') 2 FROM step1
3 WHERE CONTAINS(object_value,'オラクル INPATH(/申込/契約者)') > 0;
EXTRACTVALUE(OBJECT_VALUE,'/申込/@NO')
---000123
リスト9-15 INPATH演算子を使った問合せ例
HASPATH演算子
‘/申込/サービス/@CODE’の要素が’G2456’である XML 文書を検索し、’/申込 /@NO’を表示させます。
SQL> SELECT extractValue(object_value,'/申込/@NO') 2 FROM step1
3 WHERE CONTAINS(object_value,
4 'HASPATH(/申込/サービス/@CODE="G2456")') > 0;
EXTRACTVALUE(OBJECT_VALUE,'/申込/@NO')
---000123
リスト9-16 HASPATH演算子を使った問合せ例
---
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---
| 0 | SELECT STATEMENT | | 1 | 2014 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| STEP1 | 1 | 2014 | 4 (0)| 00:00:01 |
|* 2 | DOMAIN INDEX | IX_STEP1D | | | 4 (0)| 00:00:01 | ---
リスト9-17 実行計画の確認
CONTEXT索引は、定期的に索引の同期化と最適化処理が必要です。
SQL> EXEC CTX_DDL.SYNC_INDEX('IX_STEP1D', '1M');
リスト9-18 CONTEXT索引の同期化例
SQL> EXEC CTX_DDL.OPTIMIZE_INDEX('IX_STEP1D', 'FULL');
リスト9-19 CONTEXT索引の最適化