12.3 LOB列に対する索引の作成

LOBの内容はアプリケーションに固有であることが多いため、通常、LOB列の索引がアプリケーション・ロジックを処理します。LOB列にファンクション索引またはドメイン索引を作成して、LOB列に格納されているデータにアクセスする問合せのパフォーマンスを改善できます。LOB列には、Bツリーまたはビットマップ索引を構築できません。

ファンクション索引およびドメイン索引は、LOB列に対してDML操作が実行されるとき、またはDBMS_LOBなどのAPIを使用してLOBが更新されるときに自動的に更新されます。

LOBオープン/クローズAPIを使用して、一連の書込み操作の後に索引メンテナンスを遅延できます。LOBを読取り/書込みモードでオープンすると、そのLOBをクローズするまでLOB列の索引メンテナンスが遅延されます。これは、LOBに書き込むたびにデータベースで索引メンテナンスを実行しない場合に便利です。オープンしているLOBに対して複数の書込み操作を実行する場合は、この方法でオープンするとアプリケーションのパフォーマンスを改善できます。LOB列の索引は、LOBを明示的にクローズするまで無効です。

関連項目:

始める前に

12.3.1 LOB列に対するファンクション索引付け

ファンクション索引とは、式に対して作成される索引です。これによって、列のみの場合より索引機能が拡張されます。ファンクション索引により、データ・アクセスの方法が多様化します。

次の例に、SQLファンクションを使用したLOB列のファンクション索引の作成を示します。

-- Function-Based Index using a SQL function
CREATE INDEX ad_sourcetext_idx_sql ON print_media(to_char(substr(ad_sourcetext,1,10)));

次の例に、PL/SQLファンクションを使用してLOB列にファンクション索引を作成する方法を示します。

-- Function-Based Index using a PL/SQL function
-- LOB can be an input but cannot be the return type of hte function
CREATE OR REPLACE FUNCTION Ret1st2Char(CLobInput CLOB) RETURN CHAR DETERMINISTIC IS
       First2Char         CHAR(2) ;
       NoOfChar           INTEGER ;
BEGIN
        NoOfChar := 2 ;
        DBMS_LOB.Read(CLobInput, NoOfChar, 1, First2Char) ;
        RETURN First2Char ;
END ;
/
 
CREATE INDEX ad_sourcetext_idx_plsql on print_media(Ret1st2Char(ad_sourcetext));

12.3.2 LOB列のドメイン索引付け

拡張索引付けインタフェースを使用して作成された索引は、ドメイン索引と呼ばれます。

データベースには、必要に応じて新規索引タイプを定義できる拡張索引作成インタフェースが用意されています。これは、データ・カートリッジとデータベースがテキストや空間などのデータ型の索引を作成および保持する協調索引付けの概念に基づいています。

カートリッジは、索引構造の定義、ロード操作および更新操作中の索引内容のメンテナンス、問合せ処理中の索引の検索を行います。索引構造は、ヒープ構成表または索引構成表としてOracleに格納するか、オペレーティング・システム・ファイルとして外部に格納できます。

この構造をサポートするために、データベースには索引タイプが用意されています。索引タイプの目的は、データ・カートリッジを使用して、テキスト、空間およびイメージなどの複合ドメインを効率的に検索および取出しできるようにすることです。索引タイプは、Oracleサーバーに組み込まれているソート済の索引またはビットマップ索引に似ています。相違点は、組込み索引はOracleカーネルによって実装されますが、索引タイプはデータ・カートリッジの開発者によって実装されることです。データ・カートリッジの開発者が新しい索引タイプを実装すると、データ・カートリッジのエンド・ユーザーは、組込み索引タイプと同様にその索引タイプを使用できます。

データベース・システムがドメイン索引の物理的な格納を処理する場合、データ・カートリッジは次のことを行います。:

  • 索引のフォーマットおよび内容の定義。これによって、カートリッジが複合データ・オブジェクトを保存できる索引構造を定義できます。たとえば、テキスト・ドキュメントの逆方向の索引や空間機能の四分木などです。
  • ドメイン索引の作成、削除および更新。カートリッジは、索引構造の構築およびメンテナンスを処理します。
  • 索引の内容へのアクセスおよび解析。この機能を持つデータ・カートリッジは、問合せの処理に不可欠なコンポーネントです。データベースへの問合せの内容に関連する句は、データ・カートリッジが処理します。

データベースでは、ドメイン索引がサポートされるため、LOBなどの複合データ型にアクセスするパフォーマンスの高いソリューションを非常に簡単に開発できます。

12.3.2.1 拡張可能オプティマイザ

拡張可能オプティマイザを使用すると、ユーザー定義ファンクションおよびドメイン索引に関する統計を収集できます。

SQLオプティマイザは、LOB列の統計を収集できず、LOB列を含むコストや述語の選択性を見積もることもできません。かわりに、ユーザー定義ファンクションおよびドメイン索引の作成者は、拡張可能オプティマイザの機能を使用して、統計集計関数、選択関数およびコスト関数を作成できます。オプティマイザは、この情報を使用して問合せ計画を選択します。コストベース・オプティマイザは、ユーザーが提供する情報を使用するように拡張されています。

拡張可能索引付けインタフェースを使用すると、新しい演算子、索引タイプおよびドメイン索引を定義できます。これらのユーザー定義演算子およびドメイン索引については、拡張可能オプティマイザのインタフェースを使用して、オプティマイザが実行計画を選択するために使用する3つの主な構成要素(統計、選択性、コスト)を制御できます。これにより、カートリッジ開発者は、LOBなどの複合データ型に対する述語または索引を含む問合せを効率的に実行するために、拡張可能オプティマイザをチューニングできます。

12.3.2.2 LOB列のテキスト索引

LOB列の内容がドキュメント・タイプの内容に対応している場合、ユーザーはOracle Text索引を使用してこのような列を索引付けできます。

たとえば、CLOB列にテキストベースのドキュメントを格納する次の表DOCUMENT_TABLEについて考えます。
CREATE TABLE document_table (
    docno NUMBER,
    document CLOB);
DOCUMENT列の内容をOracle Text索引付けオプションのいずれかを使用して索引付けすると、テキストベースの問合せを高速化できます。次の例では、DOCUMENT列に対するテキスト検索問合せに使用されるSEARCH索引を作成します。
CREATE INDEX document_index ON document_table (document) INDEXTYPE IS CTXSYS.CONTEXT; 

CREATE SEARCH INDEX document_index ON document_table (document);

ノート:

他の形式でもOracle Text索引を作成できます。その他の形式の例には、PDF、JSONまたはXMLがあります。