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.1 CTXCAT索引とDML操作

CTXCAT索引は、トランザクション・ベースで更新されます。元表で挿入、更新および削除を実行すると、索引が自動的に同期化されます。CONTEXT索引と異なり、CTX_DDL.SYNC_INDEXは不要です。

ノート:

トリガーを起動せずに挿入を実行するアプリケーション(SQL*Loaderなど)では、前述の索引の自動同期化は行われません。

4.6.2 CTXCATサブ索引とそのコスト

CTXCAT索引には、索引セットの構成要素として定義したサブ索引が含まれます。1つ以上の列にサブ索引を作成すると、複合問合せのパフォーマンスが向上します。ただし、CTXCAT索引の作成に要する時間は、その総サイズによって異なります。CTXCAT索引の総サイズに直接関係する要因は、次のとおりです。

  • 索引付けするテキストの合計数

  • 索引セットに含まれるサブ索引の数

  • サブ索引を構成する元表の列数

索引セットにコンポーネント索引が多数ある場合も、更新する必要がある索引が多くなるため、挿入、更新および削除操作のパフォーマンスが低下します。

CTXCAT索引の作成には追加の索引付け時間とディスク領域が必要になるため、索引セットにコンポーネント索引を追加する前に、それぞれのコンポーネント索引によってアプリケーションに提供される問合せパフォーマンス上のメリットを慎重に考慮する必要があります。

ノート:

BASIC_STORAGEI_ROWID_INDEX_CLAUSEを使用すると、CTXCAT索引の作成を高速化できます。この句については、『Oracle Textリファレンス』で説明しています。

4.6.3 CTXCATサブ索引の作成

オンライン・オークション・サイトでは、品目の説明、価格、入札終了日などの情報を格納し、参照する必要があるため、CTXCAT索引作成のよい例です。

図4-1 Auction表のスキーマとCTXCAT索引

図4-1の説明が続きます
「図4-1 Auction表のスキーマと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でのソートの条件が付与されたもの、およびpricebid_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つの構造化列pqに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')
;

関連項目:

CREATEINDEXを使用したCTXCAT索引の作成方法についてさらに学習するには、『Oracle Textリファレンス』を参照してください。