4.6 CTXCAT索引の作成
CTXCAT
索引タイプは、小さなテキスト断片や関連情報の索引付けに最適です。
この索引タイプは、CONTEXT
索引よりも優れた構造化問合せのパフォーマンスが得られます。
ノート:
Oracle Textの索引タイプCTXCAT
は、Oracle Database 23aiでは非推奨です。索引タイプ自体とその演算子CTXCAT
は、将来のリリースで削除される可能性があります。CONTEXT
問合せの代替文法としてCTXCAT
およびCTXCAT
文法の使用はどちらも非推奨です。かわりに、Oracleでは、CONTEXT
索引タイプを使用することをお薦めします。索引タイプは、トランザクション以外のすべての同じ機能を提供できます。CONTEXT
でのトランザクションに近い動作は、SYNC(ON COMMIT)
または短い期間(できればSYNC(EVERY [time-period])
)を使用して実現できます。
CTXCAT
は、通常、索引のサイズが数メガバイトのときに導入されました。最近の大規模な索引は、CTXCAT
で管理が困難な場合があります。CTXCAT
への索引セットの追加は、CONTEXT
索引タイプでFILTER BY
列とORDER BY
列、またはSDATA
列(あるいはその両方)を使用することで、より効率的に実行できます。したがって、CTXCAT
が適切な選択になることはほとんどありません。Oracleでは、より効率的なCONTEXT
索引タイプを選択することをお薦めします。
4.6.2 CTXCATサブ索引とそのコスト
CTXCAT
索引には、索引セットの構成要素として定義したサブ索引が含まれます。1つ以上の列にサブ索引を作成すると、複合問合せのパフォーマンスが向上します。ただし、CTXCAT
索引の作成に要する時間は、その総サイズによって異なります。CTXCAT
索引の総サイズに直接関係する要因は、次のとおりです。
-
索引付けするテキストの合計数
-
索引セットに含まれるサブ索引の数
-
サブ索引を構成する元表の列数
索引セットにコンポーネント索引が多数ある場合も、更新する必要がある索引が多くなるため、挿入、更新および削除操作のパフォーマンスが低下します。
CTXCAT
索引の作成には追加の索引付け時間とディスク領域が必要になるため、索引セットにコンポーネント索引を追加する前に、それぞれのコンポーネント索引によってアプリケーションに提供される問合せパフォーマンス上のメリットを慎重に考慮する必要があります。
ノート:
BASIC_STORAGE
I_ROWID_INDEX_CLAUSE
を使用すると、CTXCAT
索引の作成を高速化できます。この句については、『Oracle Textリファレンス』で説明しています。
4.6.3 CTXCATサブ索引の作成
オンライン・オークション・サイトでは、品目の説明、価格、入札終了日などの情報を格納し、参照する必要があるため、CTXCAT
索引作成のよい例です。
図4-1は、次のスキーマを使用したAUCTION
という表を示しています。
create table auction( item_id number, title varchar2(100), category_id number, price number, bid_close date);
サブ索引を作成するには、サブ索引を格納する索引セットを作成します。
begin ctx_ddl.create_index_set('auction_iset'); end;
次に、入力する可能性がある構造化問合せを特定します。CATSEARCH
問合せ演算子では、必須のテキスト句とオプションの構造化句を使用します。
この例では、すべての問合せにテキスト列であるtitle
列の句が組み込まれています。
構造化句は、次のカテゴリに分類されるとします。
構造化句 | 問合せを満たすサブ索引の定義 | カテゴリ |
---|---|---|
'price < 200' 'price = 150' 'order by price' |
'price' |
A |
'price = 100 order by bid_close' 'order by price, bid_close' |
'price, bid_close' |
B |
構造化問合せ句カテゴリA
構造化問合せ句には、次のように、price
列のみの式が含まれています。
SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'price < 200')> 0; SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'price = 150')> 0; SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'order by price')> 0;
これらの問合せはサブ索引Bを使用して処理できます。ただし、効率を考えてprice
にのみ索引(サブ索引A)を作成することもできます。
begin ctx_ddl.add_index('auction_iset','price'); /* sub-index A */ end;
構造化問合せ句カテゴリB
構造化問合せ句には、price
についての等式にbid_close
でのソートの条件が付与されたもの、およびprice
とbid_close
の両方で(この順に)ソートの条件が付与されたものが含まれます。
SELECT FROM auction WHERE CATSEARCH( title, 'camera','price = 100 ORDER BY bid_close')> 0; SELECT FROM auction WHERE CATSEARCH( title, 'camera','order by price, bid_close')> 0;
これらの問合せは、次のように定義したサブ索引で満たすことができます。
begin ctx_ddl.add_index('auction_iset','price, bid_close'); /* sub-index B */ end;
結合されたBツリー索引と同様に、CTX_DDL.ADD_INDEX
を使用して指定する列の順序は、特定の問合せを満たすために使用される索引スキャンの効率性および実行可能性に影響します。たとえば、2つの構造化列p
とq
にBツリー索引が'p,q'
として指定されている場合、Oracle Textでは、この索引をスキャンして'ORDER
BY q,p'
をソートできません。
4.6.4 CTXCAT索引の作成
この例では、前述の例を結合し、2つのサブ索引を持つ索引セット・プリファレンスを作成します。
begin ctx_ddl.create_index_set('auction_iset'); ctx_ddl.add_index('auction_iset','price'); /* sub-index A */ ctx_ddl.add_index('auction_iset','price, bid_close'); /* sub-index B */ end;
図4-1は、サブ索引AおよびBをAUCTION表から作成する方法を示しています。各サブ索引はそれぞれテキスト列と名前付き構造化列のBツリー索引です。たとえば、サブ索引Aは、title
列とbid_close
列の索引です。
結合されたカタログ索引は、CREATE
INDEX
文を使用して次のように作成します。
CREATE INDEX auction_titlex ON AUCTION(title) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS ('index set auction_iset') ;