ヘッダーをスキップ
Oracle Databaseデータ・カートリッジ開発者ガイド
11gリリース1(11.1)
E05688-02
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

8 ドメイン索引の作成

この章では、ドメイン索引の概念とODCIIndexインタフェースについて説明します。さらに、ドメイン索引、パーティション化、適用される制限事項および移行プロシージャの使用方法を示します。

この章の内容は、次のとおりです。

すでにユーザー管理ドメイン索引を使用している場合、実装の詳細は、付録A「ユーザー管理ドメイン索引」を参照してください。

索引タイプとドメイン索引の概要

ドメイン索引とは、空間処理やイメージ処理など、特化されたドメイン向けに設計された索引です。設計者が索引タイプを作成した後、ユーザーがタイプを指定してドメイン索引を作成できます。ドメイン索引とは、業界、業務またはその他の特別な用途に固有の動作を持つ索引で、カートリッジ開発中に指定する必要があります。

ドメイン索引へのシステム管理アプローチはOracle Database 11gリリース1で新しく追加された機能で、プログラムの負荷を軽減し、従来のユーザー管理ドメイン索引よりも適切なパフォーマンスを提供します。ユーザー管理アプローチの制限に対処し、次のようなメリットがあります。

ユーザー管理ドメイン索引は将来のOracle Databaseのリリースでは非推奨となるため、システム管理ドメイン索引を使用して新規アプリケーションを開発することをお薦めします。

索引タイプにより、テキスト、空間およびイメージ処理などの複合ドメインに使用する検索および取出しメソッドがカプセル化されます。索引タイプは、Oracle Databaseで提供される索引に類似しています。ただし、索引タイプを実装するアプリケーション・ソフトウェアを提供するのがユーザーであるという違いがあります。

索引タイプには、次の2つの主要コンポーネントがあります。

索引タイプを作成する手順は、次のとおりです。

このコンテキストでの意味は、次のとおりです。

ODCIIndexインタフェース

ODCIIndexインタフェースでは、索引タイプを実装するために提供する必要のあるルーチンがすべて指定されます。各ルーチンは、型のメソッドとして実装する必要があります。

ODCIIndexインタフェースは、次のメソッド・クラスで構成されています。


関連項目

メソッドのシグネチャとパラメータの説明は、第20章「拡張可能索引付けインタフェース」を参照してください。

索引定義メソッド

索引定義メソッドは、ユーザーが索引タイプの索引に対してCREATEALTERDROPまたはTRUNCATE文を発行するとコールされます。

ODCIIndexCreate()

ユーザーが索引タイプを参照するCREATE INDEX文を発行すると、OracleはODCIIndexCreate()メソッドをコールし、CREATE INDEX...PARAMETERS (...)文の一部として指定されたパラメータと索引の説明を渡します。

通常、このメソッドでは、索引データを格納する予定の表またはファイルが作成されます。実表が空でなければ、このメソッドで索引も作成する必要があります。

ODCIIndexAlter()

ユーザーが索引タイプを参照するALTER INDEX文を発行すると、OracleはODCIIndexAlter()メソッドをコールし、指定のパラメータとともに変更対象のドメイン索引の説明を渡します。このメソッドは、REBUILDまたはRENAMEオプションが指定されたALTER INDEXを処理するためにもコールされます。メソッドに必要な動作はドメイン索引の性質に応じて異なるため、詳細は索引タイプの設計者が指定する必要があります。

ODCIIndexDrop()

ユーザーがDROP INDEX文を発行して索引タイプの索引を破棄する場合、OracleはODCIIndexDrop()メソッドをコールします。

索引メンテナンス・メソッド

索引タイプで索引付けされた列またはオブジェクト型の属性を含む表に対して、ユーザーがINSERTUPDATEおよびDELETE文を発行すると、索引メンテナンス・メソッドがコールされます。

ODCIIndexInsert()

ユーザーがレコードを挿入すると、OracleはODCIIndexInsert()メソッドをコールして、索引付けされた列の新規の値および対応するROWIDを渡します。

ODCIIndexDelete()

ユーザーがレコードを削除すると、OracleはODCIIndexDelete()メソッドをコールして、索引付けされた列の古い値および対応するROWIDを渡します。

ODCIIndexUpdate()

ユーザーがレコードを更新すると、OracleはODCIIndexUpdate()メソッドをコールして、索引付けされた列の新旧の値および対応するROWIDを渡します。

索引スキャン・メソッド

索引スキャン・メソッドでは、索引タイプでサポートされる演算子を含む述語を評価するための、索引ベースの実装を指定します。索引スキャンには、初期化、行またはROWIDのフェッチ、すべての行が戻された後のクリーン・アップを行うメソッドが関係します。

演算子述語を評価して結果行セットを戻すには、次の2つのモードがあります。

  • すべて事前計算: 結果セット全体がODCIIndexStart()で計算されます。ODCIIndexFetch()の各コールからの行バッチを戻して結果全体を反復します。このモードは、結果セット全体を調べて候補の行ごとにランク付けや関連性などを計算する必要のある演算子に適用可能です。また、アプリケーションで必要な場合は、一度に1行ずつ戻すことも可能です。

  • 増分計算: ODCIIndexFetch()の各コールで結果行のバッチを計算します。このモードは、結果セット全体を調べずに候補の行を一度に1つずつ判別できる演算子に適用可能です。また、アプリケーションで必要な場合は、一度に1行ずつ戻すことも可能です。

ODCIIndexStart()

Oracleは索引スキャンの開始時にODCIIndexStart()メソッドをコールして、索引と演算子の情報を渡します。通常、このメソッドは次の操作を実行します。

  • スキャンに使用するデータ構造を初期化します。

  • 索引データを格納する表を問い合せるSQL文を解析して実行します。

  • フェッチおよびクリーン・アップ・メソッドに必要な状態情報を保存し、状態または状態へのハンドルを戻します。

  • ODCIIndexFetch()の初回起動時に戻される結果行セットを生成する場合があります。

索引と演算子の情報は、フェッチおよびクリーン・アップ・メソッドには渡されません。そのため、ODCIIndexStart()では、索引スキャン・ルーチン間で共有する必要のある状態データを保存し、出力のsctxパラメータを介して戻す必要があります。大量の状態データを共有するには、カーソル時間メモリーを割り当てて、メモリーへのハンドルをsctxパラメータで戻します。


関連項目

メモリー・サービスとコンテキストのメンテナンスの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

メンバー・メソッドとしてODCIIndexFetch()およびODCIIndexClose()に組込みSELFパラメータが渡され、これを介して状態データにアクセスできます。

ODCIIndexFetch()

Oracleは、ODCIIndexFetch()メソッドをコールし、ODCIIndexStart()または前のODCIIndexFetch()コールから戻された状態データを渡して、演算子述語を満たす次の行バッチのROWIDを戻します。演算子述語は、演算子式(名前と引数)および演算子の戻り値の上限および下限として指定されます。つまり、ODCIIndexFetch()は、演算子の戻り値が指定の範囲内に含まれる行のROWIDを戻す必要があります。索引スキャンの終了を示すには、NULLを戻します。

ODCIIndexClose()

Oracleは、カーソルがクローズまたは再利用されるときにODCIIndexClose()メソッドをコールして、現在の状態を渡します。ODCIIndexClose()では、索引タイプに必要なクリーン・アップまたはクローズ操作を実行する必要があります。

索引メタデータ・メソッド

ODCIIndexGetMetadata()メソッドはオプションです。このメソッドを実装すると、エクスポート・ユーティリティによりコールされ、実装固有のメタデータがエクスポート・ダンプ・ファイルに書き込まれます。このメタデータはポリシー情報、バージョン情報、個別のユーザー設定などで、システム・カタログには格納されません。メタデータは、関連索引が作成される直前のインポート時に実行される無名PL/SQLブロックとしてダンプ・ファイルに書き込まれます。

索引メソッド実行時のトランザクションのセマンティクス

索引インタフェース・メソッド(索引定義メソッドODCIIndexCreate()ODCIIndexAlter()およびODCIIndexDrop()以外)は、これらのアクションをトリガーしたものと同じトランザクションでコールされます。したがって、この種のルーチンによる変更はアトミックであり、親トランザクションに基づいてコミットされるか強制終了されます。そのために、各種索引タイプ・ルーチンで実行できるアクションの性質には一定の制限があります。

  • 索引定義ルーチンには、制限はありません。

  • 索引メンテナンス・ルーチンで実行できるのは、データ操作言語(DML)文のみです。この種のDML文では、ドメイン索引の作成に使用された実表を更新できません。

  • 索引スキャン・ルーチンで実行できるのは、SQL問合せ文のみです。

たとえば、INSERT文によりODCIIndexInsert()ルーチンが起動されると、ODCIIndexInsert()INSERTと同じトランザクションで実行されます。ODCIIndexInsert()ルーチンでは、必要な数のDML文(索引構成表への挿入など)を実行できます。元のトランザクションが強制終了すると、索引タイプ・ルーチンにより行われた変更はすべてロールバックされます。

ただし、索引タイプ・ルーチンによりデータベース外部の変更(外部ファイルへの書込みなど)が行われる場合、トランザクションのセマンティクスは保証されません。

索引定義ルーチンのトランザクションのセマンティクス

索引定義ルーチンには、そのアクションの性質に関する制限がありません。この違いを理解するためにODCIIndexCreate()を考えてみます。ODCIIndexCreate()で実行される標準的なアクション・セットは次のとおりです。

  1. 索引構成表の作成

  2. 索引構成表へのデータの挿入

  3. 索引構成表の1列での2次索引の作成

ODCIIndexCreate()でDDL文とDML文の任意の順序を実行できるように、各文が独立した操作とみなされます。そのため、ODCIIndexCreate()による変更がアトミックであるという保証はありません。これは、他の索引定義ルーチンの場合も同様です。

索引メソッド実行時の一貫性のセマンティクス

索引メンテナンス(およびスキャン・ルーチン)は、DML(または問合せ)操作を実行するトップレベルSQL文と同じスナップショットで実行されます。このため、索引メソッドにより処理される索引データと実表内のデータとの一貫性が維持されます。

索引メソッド実行時の権限

索引タイプ・ルーチンは、常に索引の所有者として実行されます。これをサポートするために、索引アクセス・ドライバは索引タイプ・ルーチンを起動する前に、ユーザー・モードを索引所有者に動的に変更します。

特定の操作では、索引タイプ・ルーチンにより索引タイプ設計者が所有する表に情報を格納する操作が必要になる場合があります。索引タイプ実装では、これらのアクションを定義者の権限で実行される個別のルーチンで実行する必要があります。


関連項目

CREATE TYPEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

索引タイプの作成、削除およびコメント化

この項では、索引タイプを操作するSQL文について説明します。


関連項目

各SQL文の詳細は『Oracle Database SQL言語リファレンス』を参照してください。

索引タイプの作成

ODCIIndexインタフェースを実装して実装タイプを定義した後、索引タイプでサポートされる演算子のリストを指定し、索引インタフェースを実装するタイプを参照して、新規の索引タイプを作成できます。

例8-1で示すように、情報検索の例では、新規の索引タイプTextIndexTypeを定義するDDL文は次のようになります。この索引タイプはContains演算子をサポートし、その実装は型のTextIndexMethodsで提供されます。

例8-1 索引タイプの作成方法

CREATE INDEXTYPE TextIndexType
FOR Contains (VARCHAR2, VARCHAR2)
USING TextIndexMethods
WITH SYSTEM MANAGED STORAGE TABLES;

実装タイプでは、ODCIIndexインタフェース・ルーチンのみでなくODCIGetInterfaces()ルーチンも実装する必要があります。このルーチンにより実装タイプで実装されたインタフェースのバージョンが戻されます。Oracleは、CREATE INDEXTYPEの実行時にODCIGetInterfaces()ルーチンをコールします。索引タイプでOracle9i以降のバージョンのルーチンが実装される場合は、ODCIGetInterfaces()OUTパラメータにSYS.ODCIINDEX2を指定する必要があります。Oracle8iルーチンにはODCIEnvパラメータがないので、索引タイプでOracle8iバージョンのルーチンが実装される場合は、ODCIGetInterfaces()OUTパラメータにSYS.ODCIINDEX1を指定する必要があります。

索引タイプの削除

索引タイプの定義を削除するには、DROP文を使用します。次に例を示します。

DROP INDEXTYPE TextIndexType;

DROPのデフォルト動作はDROP RESTRICTのセマンティクスです。つまり、索引タイプを使用する1つ以上のドメイン索引が存在する場合、DROP操作は禁止となります。ユーザーは、FORCEオプションを使用してデフォルト操作をオーバーライドできます。このオプションを指定すると、索引タイプが削除され、依存ドメイン索引に無効マークが付けられます。


関連項目

オブジェクトの依存性と削除のセマンティクスの詳細は、「オブジェクトの依存性、削除のセマンティクスおよび検証」を参照してください。

索引タイプのコメント化

例8-2で示すように、索引タイプまたは演算子に関する情報を提供するには、COMMENT文を使用します。

例8-2 索引タイプをコメント化する方法

COMMENT ON INDEXTYPE
Ordsys.TextIndexType IS 'implemented by the type TextIndexMethods to support the Contains operator';

索引タイプに関するコメントは、次のデータ・ディクショナリ・ビューで表示できます。

  • ALL_INDEXTYPE_COMMENTSには、現在のユーザーがアクセス可能なユーザー定義索引タイプのコメントが表示されます。

  • DBA_INDEXTYPE_COMMENTSには、データベース内すべてのユーザー定義索引タイプのコメントが表示されます。

  • USER_INDEXTYPE_COMMENTSには、現在のユーザーが所有するユーザー定義索引タイプのコメントが表示されます。

表8-1ではALL_INDEXTYPE_COMMENTSビュー、DBA_INDEXTYPE_COMMENTSビューおよびUSER_INDEXTYPE_COMMENTSビュー

データ型 値が必要な場合 説明
OWNER
VARCHAR2(30)
NOT NULL

ユーザー定義索引タイプの所有者

INDEXTYPE_NAME
VARCHAR2(30)
NOT NULL

ユーザー定義索引タイプ名

COMMENT
VARCHAR2(4000)


ユーザー定義索引タイプのコメント


索引タイプにコメントを付けるには、その索引タイプが自分のスキーマ内に存在するか、COMMENT ANY INDEXTYPE権限を持っている必要があります。

ドメイン索引

この項では、ドメイン索引の操作と、ドメイン索引関連のメタデータを取得する方法について説明します。

ドメイン索引の操作

次の項では、ドメイン索引の作成、変更、切捨ておよび削除について説明します。

ドメイン索引の作成

ドメイン索引は、Bツリー索引と同様に表の1列に作成できます。ただし、例8-3のように、索引タイプを明示的に指定する必要があります。

例8-3 ドメイン索引の作成方法

CREATE INDEX ResumeTextIndex ON Employees(resume)
INDEXTYPE IS TextIndexType
PARAMETERS (':Language English :Ignore the a an');

INDEXTYPE句には、使用する索引タイプを指定します。PARAMETERS句では、文字列として指定されたドメイン索引のパラメータを識別します。この文字列は解析されずにODCIIndexCreate()ルーチンに渡され、ドメイン索引の作成に使用されます。前述の例では、パラメータ文字列により、テキスト・ドキュメントの言語(および使用する字句アナライザ)とテキスト索引の作成時に無視するストップワードのリストが識別されています。

ドメイン索引の変更

ドメイン索引は、ALTER INDEX文を使用して変更できます。次に例を示します。

ALTER INDEX ResumeTextIndex PARAMETERS (':Ignore on');

パラメータ文字列は解析されずにODCIIndexAlter()ルーチンに渡され、このルーチンにより適切なアクションが実行されてドメイン索引が変更されます。この例では、テキスト索引内で無視するストップワードを追加指定しています。

ALTER文を使用すると、ドメイン索引の名前を変更できます。

ALTER INDEX ResumeTextIndex RENAME TO ResumeTIdx;

この書式の文を発行すると、OracleによりODCIIndexAlter()メソッドがコールされ、適切なアクションが実行されてドメイン索引の名前が変更されます。

また、ALTER文を使用すると、ドメイン索引を再作成することもできます。

ALTER INDEX ResumeTextIndex REBUILD PARAMETERS (':Ignore off');

前述の例と同じODCIIndexAlter()ルーチンがコールされますが、ALTERオプションに関する情報が追加されています。

エンド・ユーザーが索引構成表(IOT)のドメイン索引に対してALTER INDEX domain_index UPDATE BLOCK REFERENCESを実行すると、AlterIndexUpdBlockRefsビットが設定された状態でODCIIndexAlter()がコールされます。これにより、論理ROWIDのドメイン索引に格納される行のブロック位置に関する不確定要素を更新できます。

ドメイン索引の切捨て

ドメイン索引を切り捨てるための明示的な文は存在しません。ただし、対応する実表が切り捨てられる場合は、ドメイン索引の基礎となる記憶表も切り捨てられます。さらに、ODCIIndexAlter()が起動されます。

TRUNCATE TABLE Employees;

alter_option set to AlterIndexRebuildのあるODCIIndexAlter()メソッドをコールしてResumeTextIndexを切り捨てます。

ドメイン索引の削除

ドメイン索引のインスタンスを削除するには、DROP INDEX文を使用します。次に例を示します。

DROP INDEX ResumeTextIndex;

この例では、ODCIIndexDrop()メソッドがコールされ、索引に関する情報が渡されます。

索引構成表のドメイン索引

この項では、索引タイプにより索引構成表にドメイン索引が作成される場合の考慮事項について説明します。ODCIIndexInfo構造内でIndexInfoFlagsIndexOnIOTビットを使用すると、実表がIOTかどうかを判別できます。

UROWID列へのROWIDの格納

ドメイン索引の実表が索引構成表で、実表のROWIDを独自の表に格納するときに、ROWIDが等価かどうかをテストする場合は、ROWIDをUROWID(ユニバーサルROWID)列に格納する必要があります。

ROWIDがVARCHAR列に格納されている場合、実表と独自の表の間でROWIDのテキスト等価比較を実行すると、ROWIDで同じ行が選択されて失敗することがあります。これは、索引構成表では物理ROWIDのかわりに論理ROWIDが使用され、物理ROWIDとは異なり、同じ行にある複数の論理ROWIDのテキスト表現が異なる場合があるためです。同じ主キーを持つ2つの論理ROWIDは、ともに格納されている不確定要素のデータ・ブロック・アドレス(DBA)に関係なく同一です。

1つのUROWID列に物理ROWIDと論理ROWIDの両方を格納できます。IOTのROWIDをUROWID列に格納すると、主キー情報は同じだが不確定要素DBAの異なる2つの論理ROWIDに対する等価演算子が確実に成功します。

IOTの実表からCREATE TABLE AS SELECTを実行して、ROWID列を持つ索引記憶表を作成すると、適切なサイズのUROWID列が索引表に作成されます。ROWID列を持つ表を作成する場合は、ROWID列をUROWID(x)型として明示的に宣言する必要があります。xUROWID列のサイズです。実表の任意のROWIDを十分に保持できるサイズ、つまり、実表の主キーのファンクションを選択する必要があります。例8-4で示される問合せを使用すると、UROWID列に適したサイズを判断できます。

例8-4 UROWID列サイズの取得方法

SELECT (SUM(column_length + 3) + 7)
FROM user_ind_columns ic, user_indexes i
WHERE ic.index_name = i.index_name
AND i.index_type = 'IOT - TOP'
AND ic.table_ name = base_table;

記憶表を削除して再作成する場合、索引記憶表に対してALTER INDEX REBUILDを実行すると、CREATE TABLEの実行時と同じ問題が発生します。これに対して、実表がIOTである場合は、記憶表を再利用すると追加作業は不要です。

索引記憶表に対するDML

索引記憶表のUROWID列をメンテナンスする場合は、全種類のROWIDで機能するように、DML INSERTUPDATEおよびDELETE文でROWIDバインド変数の型を変更する操作が必要になることがあります。渡されるROWID引数をテキスト文字列に変換し、テキスト文字列としてバインドする方法は、物理ROWIDとユニバーサルROWIDの両方で機能します。この方法により、標準の表とIOTの両方を処理する索引タイプをコーディングできます。

索引記憶表に対する開始、フェッチおよびクローズ操作

StartFetchおよびCloseの間でコンテキストを渡すために索引スキャン・コンテキスト構造を使用する場合は、この構造を変更する必要があります。特に、この構造のバッファに問合せのROWID定義変数を格納する場合は、実表の主キーのサイズが事前にわかっているか、実行時に判別するのでないかぎり、このバッファ内のUROWIDについて最大サイズ(バイト形式のユニバーサルROWIDの場合は3800バイト、文字形式のユニバーサルROWIDの場合は5072)を割り当てる必要があります。また、FetchではODCIIndexInfoを使用できないため、実表がIOTかどうかを示すビットをコンテキスト内に格納する必要があります。

DML操作と同様に、定義変数をテキスト文字列として設定する方法は、物理ROWIDとユニバーサルROWIDの両方に使用できます。物理ROWIDが索引表からフェッチされる場合は、その長さが18文字であることを確認できます。ただし、ユニバーサルROWIDの場合は長さが最大5072文字になる可能性があるため、文字列長関数を使用して、フェッチされるユニバーサルROWIDの実際の長さを判別する必要があります。

一意でない列の索引

主キー列の値はすべて一意である必要があるため、一意でない表列に定義されたドメイン索引では、この列を索引の格納に使用される基礎的なIOTの主キーとして使用できません。この問題に対処するため、索引データを保持するIOTに1列を追加して、その列に一意の順序番号を保持できます。表に列値が挿入されるときに、一意の順序番号も生成すると、索引付けされた列を順序番号とともにIOTの主キーとして使用できます。(UROWID列をIOTの主キーの一部にすることはできないため、順序番号列をUROWIDにすることはできないことに注意してください。)この方法では、IOTの大きなメリットである主キー列値への高速アクセスも維持されます。

ドメイン索引のメタデータ

Bツリー索引の場合、ユーザーはUSER_INDEXESビューを問い合せて索引情報を取得できます。ドメイン索引について同様のサポートを提供するために、次の方法でドメイン固有のメタデータを提供できます。

  • このメタ情報を格納する1つ以上の表を定義します。この表のキー列は、索引の一意識別子である必要があります。この一意キーを索引名(schema.index)に使用できます。残りの列にメタデータを格納できます。

  • システム定義のメタデータ表を索引メタ表と結合するビューを作成し、ドメイン索引のインスタンスごとに包括的な情報セットを提供します。索引タイプ設計者はビュー定義を提供する必要があります。

エクスポート/インポートを使用したドメイン索引の移動

Bツリー索引やビットマップ索引と同様に、ドメイン索引は実表のエクスポート時にエクスポートされてからインポートされます。ただし、ドメイン索引には、システム・カタログに格納されていない実装固有のメタデータを関連付けることができます。たとえば、テキスト・ドメイン索引には、ポリシー情報、無関係なワードのリストなどを関連付けることができます。エクスポート/インポート・メカニズムによって、このメタデータがソース・プラットフォームからターゲット・プラットフォームに移動されます。

ドメイン索引のメタデータを移動するには、索引タイプでODCIIndexGetMetadata()インタフェース・メソッドを実装する必要があります。ドメイン索引のエクスポート時に、このメソッドがコールされ、ドメイン索引情報が渡されます。このメソッドは、ダンプ・ファイルに書き込まれてインポート時に実行される、必要な数の無名PL/SQLブロックを戻すことができます。これらの無名PL/SQLブロックが存在する場合は、関連ドメイン索引の作成直前に実行されます。

デフォルトでは、ドメインのセカンダリ・オブジェクトはインポートまたはエクスポートされません。ただし、インタフェースODCIIndexUtilGetTableNames()およびODCIIndexUtilCleanup()が存在する場合、これらが起動され、ドメイン索引に関連付けられているセカンダリ・オブジェクトがエクスポート/インポート操作の一部であるかどうかを判別します。


関連項目

エクスポート/インポートの使用方法は、『Oracle Databaseユーティリティ』を参照してください。

トランスポータブル表領域を使用したドメイン索引の移動

トランスポータブル表領域機能を使用すると、Oracleデータベース間で表領域を移動できます。ドメイン索引データをエクスポートしてからインポートするかわりに、トランスポータブル表領域を使用して移動できます。

トランスポータブル表領域を使用してデータを移動する方が、データのエクスポートとインポートまたはアンロードとロードを実行するよりも高速な場合があります。これは、表領域をトランスポートするには、データファイルをコピーして表領域の構造情報を統合するだけですむためです。また、ロードまたはインポートした場合のように、後で索引を再作成する必要もありません。ODCIIndexInfo内でTransTblspcフラグの有無を調べると、ODCIIndexCreate()コールがインポートされたドメイン索引の結果であるかどうかを判断できます。

ドメイン索引のセカンダリ表にトランスポータブル表領域を使用するには、実装タイプで2つのODCIインタフェースODCIIndexUtilGetTableNames()およびODCIIndexUtilCleanup()を追加提供する必要があります。


関連項目

トランスポータブル表領域の使用方法は、『Oracle Database管理者ガイド』を参照してください。

ドメイン索引のビュー

さらに次のビューでは、ユーザーがアクセス可能なドメイン索引に関連付けられているセカンダリ・オブジェクトに関する情報が提供されます。

  • ALL_SECONDARY_OBJECTSでは、ユーザーがアクセス可能なドメイン索引に関連付けられているセカンダリ・オブジェクトに関する情報が提供されます。

  • DBA_SECONDARY_OBJECTSでは、データベース内のドメイン索引に関連付けられているすべてのセカンダリ・オブジェクトに関する情報が提供されます。

  • USER_SECONDARY_OBJECTSでは、現在のユーザーが所有するドメイン索引に関連付けられているセカンダリ・オブジェクトに関する情報が提供されます。

表8-2 ALL_SECONDARY_OBJECTSビュー、DBA_SECONDARY_OBJECTSビューおよびUSER_SECONDARY_OBJECTSビュー

データ型 値が必要な場合 説明
INDEX_OWNER
VARCHAR2(30)
NOT NULL

ドメイン索引の所有者名

INDEX_NAME
VARCHAR2(30)
NOT NULL

ドメイン索引名

SECONDARY_INDEX_OWNER
VARCHAR2(30)
NOT NULL

ドメイン索引によって作成されたセカンダリ・オブジェクトの所有者

SECONDARY_INDEX_NAME
VARCHAR2(30)
NOT NULL

ドメイン索引によって作成されたセカンダリ・オブジェクト名

SECONDARY_OBJDATA_TYPE
VARCHAR2(20)
NOT NULL

セカンダリ・オブジェクトが索引タイプまたは統計タイプのいずれかで作成される場合に指定


例8-5では、例8-3で作成されたResumeTextIndexにある情報をUSER_SECONDARY_OBJECTSビューを使用して取得する方法を示します。

例8-5 *_SECONDARY_OBJECTSビューの使用方法

SELECT SECONDARY_OBJECT_OWNER, SECONDARY_OBJECT_NAME
  FROM USER_SECONDARY_OBJECTS
  WHERE INDEX_OWNER = USER and INDEX_NAME = 'ResumeTextIndex'

オブジェクトの依存性、削除のセマンティクスおよび検証

この項では、ドメイン索引で使用されるオブジェクトに影響する問題について説明します。

オブジェクトの依存性

各種オブジェクト間には、次のような依存性があります。

  • ファンクション、パッケージおよびオブジェクト型: 演算子と索引タイプで参照されます。

  • 演算子: 索引タイプ、DMLおよび問合せのSQL文で参照されます。

  • 索引タイプ: ドメイン索引で参照されます。

  • ドメイン索引: DMLおよび問合せのSQL文で参照(暗黙的に使用)されます。

そのため、これらのオブジェクトを作成したり将来のインポートに備えて定義をエクスポートする場合は、次の順序で行う必要があります。

  1. ファンクション、パッケージおよびオブジェクト型

  2. 演算子

  3. 索引タイプ

オブジェクトの削除のセマンティクス

オブジェクトについての削除動作は、次のとおりです。

  • RESTRICTセマンティクス: 依存オブジェクトが存在する場合、削除操作は禁止されます。

  • FORCEセマンティクス: 依存オブジェクトが存在する場合にもオブジェクトは削除され、依存オブジェクトには再帰的に無効マークが付けられます。

表8-3に、演算子と索引タイプについてサポートされているデフォルトの削除オプションと明示的削除オプションを示します。その他のスキーマ・オブジェクトは、完全性とコンテキストのために含まれています。

表8-3 演算子と索引タイプに対するデフォルトの削除オプションと明示的削除オプション

スキーマ・オブジェクト デフォルトの削除動作 サポートされている明示的オプション

関数

FORCE

なし

パッケージ

FORCE

なし

オブジェクト型

RESTRICT

FORCE

演算子

RESTRICT

FORCE

索引タイプ

RESTRICT

FORCE


オブジェクトの検証

無効なオブジェクトは、可能であれば次回の参照時に自動的に検証されます。

索引タイプ、ドメイン索引および演算子の権限

パーティション・ドメイン索引

レンジ・パーティション表のパーティションに対応する個別索引パーティションを持つドメイン索引を作成できます。この種の索引はローカル・ドメイン索引と呼ばれます。これに対して、索引パーティションのない索引は、グローバル・ドメイン索引と呼ばれます。ローカル・ドメイン索引は、それ自体を構成するパーティションではなく、パーティション索引全体を参照します。

ローカル・ドメイン索引は基礎となる表とともに同一レベル・パーティション化され、ローカル・ドメイン索引内のキーはすべて、対応する表パーティションに格納される行を参照します。他のパーティションの行を参照するキーはありません。

例8-6のように、CREATE INDEXTYPE文を使用して、索引タイプでローカル・ドメイン索引を使用するように指定します。

例8-6 索引タイプ内でローカル・ドメイン索引メソッドを使用する方法

CREATE INDEXTYPE TextIndexType
  FOR Contains (VARCHAR2, VARCHAR2)
  USING TextIndexMethods
  WITH LOCAL RANGE PARTITION
  WITH SYSTEM MANAGED STORAGE TABLES;

この文では、実装タイプTextIndexMethodsでローカル・ドメイン索引を作成して保守できるように指定しています。WITH LOCAL RANGE PARTITION句では、実表のパーティション化方法を指定しています。

例8-7のように、CREATE INDEX文により索引が作成され、パーティション化されます。

例8-7 索引タイプを作成してパーティション化する方法

CREATE INDEX [schema.]index
  ON [schema.]table [t.alias] (indexed_column)
  INDEXTYPE IS indextype
  [LOCAL [PARTITION [partition [PARAMETERS ('string')]]] [...] ]
  [PARALLEL parallel_degree]
  [PARAMETERS ('string')];

LOCAL [PARTITION]句は、索引がパーティション表のローカル索引であることを示します。パーティション名を指定するか、Oracleに生成させることができます。

PARALLEL句は、索引パーティションをパラレルに作成するように指定します。索引パーティション作成、再作成または移入に対応するODCIIndexAlter()ルーチンが、パラレルにコールされます。

PARAMETERS句で、解析されずに適切なODCI索引タイプ・ルーチンに渡されるパラメータ文字列を指定します。このパラメータ文字列の最大サイズは1000文字です。

この句を構文のトップレベルで指定すると、各パラメータは索引パーティションのデフォルト・パラメータとなります。この句をLOCAL [PARTITION]句の一部として指定すると、デフォルト・パラメータが個別パーティションのパラメータでオーバーライドされます。LOCAL [PARTITION]句では、複数のパーティションを指定できます。

ドメイン索引の作成後に、適切なODCIルーチンが起動されます。ルーチンが正常に値を戻さない場合、ドメイン索引にはFAILEDマークが付けられます。失敗したドメイン索引に対してサポートされている操作は、DROP INDEXおよび(非ローカル索引の場合の)REBUILD INDEXのみです。例8-8では、ローカル・ドメイン索引ResumeIndexが作成されます。

例8-8 ローカル・ドメイン索引の作成方法

CREATE INDEX ResumeIndex ON Employees(Resume)
  INDEXTYPE IS TextIndexType LOCAL;

ローカル・ドメイン索引の削除

索引パーティションを指定して明示的に削除することはできません。ローカル索引パーティションを削除するには、次のようにローカル・ドメイン索引全体を削除する必要があります。

DROP INDEX ResumeIndex;

ローカル・ドメイン索引の変更

ALTER INDEX文を使用し、ローカル・ドメイン索引に対して次の操作を実行します。

  • トップレベル索引の名前変更

  • すべての索引パーティションのデフォルトのパラメータ文字列の変更

  • 特定のパーティションに関連付けられているパラメータ文字列の変更

  • 索引パーティションの名前変更

  • 索引パーティションの再作成

ALTER INDEXTYPE文を使用すると、索引タイプを削除して再作成した後ですべての依存索引を再作成しなくとも、索引タイプのプロパティと実装タイプを変更できます。


関連項目

この項で説明したSQL文の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

索引の状態の概要

ドメイン索引と同様に、ローカル・ドメイン索引のパーティションは表8-4に示す1つ以上の状態にすることができます。

表8-4 索引の状態の概要

状態 説明

IN_PROGRESS

索引または索引パーティションがこの状態になるのは、ODCIndex DDLインタフェース・ルーチンの実行前と実行中です。通常、これは一時的な状態です。ただし、ルーチンが途中で終了すると、索引にIN_PROGRESSマークが付いたままになることがあります。

FAILED

索引に対してDDL操作を実行するODCIIndexインタフェース・ルーチンがエラーを戻すと、索引または索引パーティションにFAILEDマークが付けられます。

UNUSABLE

標準索引と同じ。一定のパーティション・メンテナンス操作の結果、パーティション表の索引にUNUSABLEマークが付けられます。パーティション索引の場合、UNUSABLEは索引全体ではなく索引パーティションにのみ関連することに注意してください。

VALID

索引にVALIDマークが付けられるのは、索引が直接または間接的に依存するオブジェクトが存在するか有効である場合です。このプロパティが関連するのは索引のみで、索引パーティションに関連することはありません。

INVALID

索引にINVALIDマークが付けられるのは、索引が直接または間接的に依存するオブジェクトが削除されたか無効化された場合です。このプロパティが関連するのは索引のみで、索引パーティションに関連することはありません。


ローカル・ドメイン索引とDML操作

ローカル・ドメイン索引の索引パーティションがIN_PROGRESSFAILEDまたはUNUSABLE状態の場合、基礎となる表に対するDML操作は実行できません。ただし、索引にUNUSABLEマークおよびSKIP_UNUSABLE_INDEXES = trueマークが付けられている場合は、索引メンテナンスは実行されていません。

索引に影響する表操作

この項の表に、索引の基礎となる表に対して実行できる操作と、索引への影響を示します。表8-5では、表操作がリストされていて、表8-6では、ALTER TABLE操作がリストされています。

表8-5 表操作の概要

表操作 説明

DROP table

表を削除します。すべての索引および対応するパーティションが削除されます。

TRUNCATE table

表を切り捨てます。すべての索引と索引パーティションが切り捨てられます。


表8-6 パーティションのメンテナンスが関係するALTER TABLE操作の概要

ALTER TABLE操作 説明

パーティションで使用できないローカル索引の変更

表パーティションに関連付けられているローカル索引パーティションにUNUSABLEマークを付けます。

パーティションの再作成で使用できないローカル索引の変更

この表パーティションに関連付けられているUNUSABLEマーク付きのローカル索引パーティションを再作成します。

パーティションの追加

新規の表パーティションを追加します。新規のローカル索引パーティションも追加されます。

パーティションの削除

表のレンジ・パーティションを削除します。関連するローカル索引パーティションも削除されます。

パーティションの切捨て

表パーティションを切り捨てます。関連するローカル索引パーティションも切り捨てられます。

パーティションの移動

実表のパーティションを別の表領域に移動します。対応するローカル索引パーティションにUNUSABLEマークが付けられます。

パーティションの分割

表パーティションが2つのパーティションに分割されます。対応するローカル索引パーティションも分割されます。分割後のパーティションが空でない場合は、索引パーティションにUNUSABLEマークが付けられます。

パーティションのマージ

2つの表パーティションをマージして1つのパーティションにします。対応するローカル索引パーティションもマージする必要があります。マージ後のパーティションにデータが含まれている場合は、索引パーティションにUNUSABLEマークが付けられます。

索引を除くパーティションの交換

表パーティションを非パーティション表と交換します。ローカル索引パーティションとグローバル索引にはUNUSABLEマークが付けられます。

索引を含むパーティションの交換

表パーティションを非パーティション表と交換します。ローカル索引パーティションは、非パーティション表のグローバル索引と交換されます。索引パーティションはUSABLEのままです。


ドメイン索引のパーティション化に使用するODCIIndexインタフェース

ローカル・ドメイン索引をサポートするには、標準ODCIIndexメソッドに加えて、ローカル・ドメイン索引固有の次の2つのメソッドを実装する必要があります。

ドメイン索引およびSQL*Loader

ドメイン索引が定義されている表について、SQL*Loaderの従来型パスによるロードとダイレクト・パス・ロードがサポートされますが、次の2つの制限があります。

  • 表がヒープ構成表である必要があります。

  • LOB列にはドメイン索引を定義できません。

IOTまたはLOB列に定義されているドメイン索引に対してダイレクト・パス・ロードを実行する手順は、次のとおりです。

  • ドメイン索引を削除します。

  • SQL*Loaderでダイレクト・パス・ロードを実行します。

  • ドメイン索引を再作成します。

システム・パーティション化の使用

システムのパーティション化により、複数の物理的パーティションで構成される単一の表を作成できます。システムのパーティション化にはパーティション化キーは使用しません。かわりに、指定された数のパーティションを作成します。したがって、作成されたパーティションには境界(範囲)、値(リスト)またはパーティション化方法は含まれません。

パーティション化キーがないため、分散表の行を該当するパーティションに明示的にマップする必要があります。たとえば行を挿入する場合、パーティション拡張構文を使用して、行がマップされるパーティションを指定する必要があります。


関連項目

『Oracle Database SQL言語リファレンス』のSQL構文のサポートに関する項を参照してください。

システム・パーティション表のメリット

システム・パーティション表の主なメリットは、別の表とともに同一レベル・パーティション化される表の作成およびメンテナンスに使用できることです。たとえば、実表と同じパーティションの数で、依存表をシステム・パーティション表として作成できます。次の理由により、このようなシステム・パーティション表はドメイン索引の索引データの格納に使用できます。

  • プルーニングは実表のプルーニング・ルールに従うため、実表内で1つのパーティションがアクセスされると、システム・パーティション表の対応するパーティションもアクセス可能になります。

  • 実表のDDLはシステム・パーティション表で複製できます。したがって、実表でパーティションが削除されると、システム・パーティション表の対応するパーティションも自動的に削除されます。

システムのパーティション化の実装

この項では、システムのパーティション化を実装する方法について説明します。

システム・パーティション表の作成

例8-9では、4つのパーティションでシステム・パーティション表を作成する方法を説明します。各パーティションに、それぞれ異なる物理属性を与えることができます。

例8-9 システム・パーティション表の作成方法

CREATE TABLE SystemPartitionedTable (c1 integer, c2 integer)
PARTITION BY SYSTEM
(
  PARTITION p1 TABLESPACE tbs_1,
  PARTITION p2 TABLESPACE tbs_2,
  PARTITION p3 TABLESPACE tbs_3,
  PARTITION p4 TABLESPACE tbs_4
);

システム・パーティション表へのデータの挿入

例8-10に、システム・パーティション表にデータを挿入する方法を示します。INSERT文またはMERGE文(ここでは表示されていません)の両方で、パーティション拡張構文を使用して、行を追加するパーティションを識別する必要があります。タプル(4,5)は、例8-9で作成された4つのパーティションのいずれかに挿入されます。例8-11で示されるように、DATAOBJ_TO_PARTITIONも使用できます。

例8-10 システム・パーティション表にデータを挿入する方法

INSERT INTO SystemPartitionedTable PARTITION (p1) VALUES (4,5);

例8-11 DATAOBJ_TO_PARTITIONを使用してシステム・パーティション表にデータを挿入する方法

INSERT INTO SystemPartitionedTable PARTITION
  (DATAOBJ_TO_PARTITION (base_table, :physical_partid))
  VALUES (...);

コードの最初の行には、名前付きパーティションへのデータの挿入方法が示されていて、2行目には、そのデータはパーティションの順序に基づいてパーティションに挿入可能であることが示されていることに注意してください。コードの3行目に示されているバインド変数のサポートは、INSERT文間のカーソルの共有を可能にするため重要です。

システム・パーティション表でのデータの削除および更新

削除および更新操作ではパーティション拡張構文は必要ありませんが、可能であればこの構文を使用することをお薦めします。パーティション・プルーニングがないため、パーティション拡張構文が省略される場合は、操作を実行するために表全体がスキャンされます。これにより、行とパーティションの間には暗黙的なマッピングがないことがわかります。

システム・パーティション表でのサポート操作

次の操作を実行することで、システムのパーティション化によるサポートが継続されます。

  • パーティション・メンテナンス操作およびその他のDDL操作(次の例外を除く)

    • ALTER INDEX SPLIT PARTITION

    • ALTER TABLE SPLIT PARTITION

    • SELECTでのCREATE TABLE

  • ローカル索引の作成(パーティション化キーが必要な一意のローカル索引を除く)

  • ローカル・ビットマップ索引の作成

  • グローバル索引の作成

  • すべてのDML操作

  • 次のようなパーティション拡張構文を使用したINSERT AS SELECT操作

    INSERT INTO TableName
      PARTITION (
        PartitionName|
        DATAOBJ_TO_PARTITION(base_table, :physical_partid))
      AS SubQuery
    

システムのパーティション化では、パーティション化方法が使用されないため、パーティションに行が分散されません。そのため、次の操作はシステムのパーティション化のサポート外になります。

  • CREATE TABLE AS SELECT代替アプローチとして、まず表を作成し、それから行を各パーティションに挿入します。

  • INSERT INTO TableName AS SubQuery

パーティション・メンテナンス操作の実行

この項では、1つの例として、ドメイン索引の実表に対して発行されたALTER TABLE SPLIT PARTITIONルーチンについて説明します。

  1. 追加または削除されるパーティションの情報を使用して、ODCIIndexUpdPartMetadata()メソッドが起動されます。1対2の分割には、1つのパーティションの削除と2つの新規パーティションの追加が必要です。

  2. 影響を受けるパーティションでODCIStatsUpdPartStatistics()が起動されます。

  3. すべてのシステム・パーティション索引および統計記憶表から分割されたパーティションが削除されます。

  4. システム・パーティション表に2つの新規のパーティションが追加されます。

  5. 分割されるパーティションが空の場合、最初のODCIIndexAlter()へのコールで分割パーティションが再作成され、2番目のODCIIndexAlter()へのコールで新しく追加されたパーティションが再作成されます。

索引を含む表交換パーティションの変更

ALTER TABLE EXCHANGE PARTITIONコマンドは、次の状況下でのみ、ドメイン索引を含む表に対して許可されます。

  • ドメイン索引が非パーティション表およびパーティション表の両方で定義される場合

  • 非パーティション表およびパーティション表の両方に、同一の関連付けられている索引タイプがある場合

ALTER TABLE EXCHANGE PARTITIONルーチンにより、次のユーザー実装メソッドが起動されます。

  1. 影響を受けるパーティションおよび索引に対するODCIIndexExchangePartition()メソッド

  2. 統計が収集される場合に影響を受けるパーティションおよび索引に対するODCIStatsExchangePartition()メソッド

システム管理ドメイン索引の使用

この項では、システム管理ドメイン索引の動作および、それらの索引の統計の収集方法および格納方法を説明し、使用上の制限事項をリストします。

システム管理ドメイン索引の動作を検証します。

図8-1に、実表T1の初期設定を示します。T1には次の要素が含まれます。

T1、索引IT1およびシステム・パーティション表SPT1に示した構造には、1対1の関係で同数のパーティションがあります。メタデータ表MT1には、これらの表内のパーティション数と同数の行があります。

図8-1 ローカル・ドメイン索引を含む3つのパーティションの表および関連構造

図8-1の説明は次にあります。
「図8-1 ローカル・ドメイン索引を含む3つのパーティションの表および関連構造」の説明

図8-2に、次の操作を実行して1つのパーティションを分割した後のT1および関連構造の状況を示します。

ALTER TABLE T1 SPLIT PARTITION P2 INTO P21, P22

図8-2 ALTER TABLE SPLIT PARTITIONの後の3つのパーティションの表

図8-2の説明は次にあります。
「図8-2 ALTER TABLE SPLIT PARTITIONの後の3つのパーティションの表」の説明

システム管理ドメイン索引の設計

非パーティション・ドメイン索引に影響するトップレベルのDDLがコールされると、ユーザー実装のODCIIndexXXX()メソッドおよびODCIStatsXXX()メソッドが起動されます。表8-7に、これらのメソッドを示します。

表8-7 非パーティション・ドメイン索引に対するODCIXXX()メソッド

DDL システム管理アプローチに使用されるODCIXXX()メソッド
CREATE INDEXTYPE

システム管理アプローチを指定

CREATE INDEX

ODCIIndexCreate()


TRUNCATE TABLE

ODCIIndexAlter

alter_option=AlterIndexRebuild付き

ALTER INDEX

ODCIIndexAlter()


GATHER_INDEX_STATS()

DBMS_STATS内)

ODCIStatsCollect()


DELETE_INDEX_STATS()

DBMS_STATS内)

ODCIStatsDelete()


DROP INDEX

(FORCE)

ODCIIndexDrop()およびODCIStatsDelete()

INSERT

ODCIIndexInsert()


DELETE

ODCIIndexDelete()


UPDATE

ODCIIndexUpdate()


QUERY

ODCIIndexStart()ODCIIndexFetch()およびODCIIndexClose()


ローカル・システム管理のドメイン索引に影響するトップレベルのDDLがコールされる場合、ユーザー実装のODCIIndexXXX()メソッドとODCIStatsXXX()メソッドが起動されます。表8-8に、これらのメソッドを示します。要約すると、次のルールが適用されます。

表8-8 ローカル・システム管理ドメイン索引に対するODCIXXX()メソッド

DDL システム管理アプローチに使用されるODCIXXX()メソッド
CREATE INDEXTYPE

システム管理アプローチを指定

CREATE INDEX

ODCIIndexCreate()へのコール、alter_option=AlterIndexRebuildを含む各パーティションに対するODCIIndexAlter()コール、およびODCIIndexCreate()への最終コール

TRUNCATE TABLE

alter_option=AlterIndexRebuildを含む各パーティションに対するODCIIndexAlter()コール

ALTER INDEX

ODCIIndexAlter()


GATHER_INDEX_STATS()

DBMS_STATS内)

ODCIStatsCollect()へのコール

DELETE_INDEX_STATS()

DBMS_STATS内)

ODCIStatsDelete()へのコール

DROP INDEX

(FORCE)

ODCIIndexDrop()、またはユーザー定義の統計が収集された場合はODCIStatsDelete()

ALTER TABLE ADD PARTITION

ODCIIndexUpdPartMetadata()alter_option=AlterIndexRebuildを含むODCIIndexAlter()

ALTER TABLE DROP PARTITION

ODCIIndexUpdPartMetadata()、統計が収集される場合はODCIStatsUpdPartStatistics()

ALTER TABLE TRUNCATE PARTITION

ODCIIndexUpdPartMetadata()alter_option=AlterIndexRebuildのあるODCIIndexAlter()、統計タイプが索引タイプに関連付けられていてユーザー定義の統計が収集された場合はODCIStatsUpdPartStatistics()

ALTER TABLE SPLIT PARTITION

ODCIIndexUpdPartMetadata()、結果的にパーティションが空である場合はalter_option=AlterIndexRebuildを含むODCIIndexAlter()、統計タイプが索引タイプに関連付けられていてユーザー定義の統計が収集された場合はODCIStatsUpdPartStatistics()

ALTER TABLE MERGE PARTITION

ODCIIndexUpdPartMetadata()、結果的にパーティションが空である場合はalter_option=AlterIndexRebuildを含むODCIIndexAlter()、統計タイプが索引タイプに関連付けられていてユーザー定義の統計が収集された場合はODCIStatsUpdPartStatistics()

ALTER TABLE EXCHANGE PARTITION

ODCIIndexExchangePartition()、統計タイプが索引タイプに関連付けられていてユーザー定義の統計が収集された場合はODCIStatsExchangePartition()

ALTER TABLE MOVE PARTITION

パーティション表に、パーティションMOVEおよび名前変更操作の一部として更新された有効なシステム管理のローカル・ドメイン索引が含まれる場合は、ODCIIndexUpdPartMetadata()システム管理索引の更新をせずにパーティションが移動された場合は、索引パーティションにUNUSABLEマークが付けられます。

GATHER_TABLE_STATS()

DBMS_STATS内)

ODCIStatsCollect()へのコール

DELETE_TABLE_STATS()

DBMS_STATS内)

統計タイプが索引タイプに関連付けられていてユーザー定義の統計が収集された場合は、ODCIStatsDelete()へのコール

ALTER INDEX PARTITION

ODCIIndexAlter()


INSERT

ODCIIndexInsert()


DELETE

ODCIIndexDelete()


UPDATE

ODCIIndexUpdate()


QUERY

ODCIIndexStart()ODCIIndexFetch()およびODCIIndexClose()


ローカル・ドメイン索引の作成

CREATE INDEXルーチンには次のステップが実装されています。

  1. システム・パーティション記憶表を作成するには、索引情報を含むODCIIndexCreate()がコールされます。ODCIIndexInfo.IndexPartitionTotal属性にパーティションの数が指定されます。すべてのパーティション記憶表をシステム・パーティション化する必要があることに注意してください。

    オブジェクト・レベルのCREATEルーチンはオブジェクト・レベルのパラメータ文字列にのみ渡されます。すべてのパーティションに記憶属性を構成するには、索引タイプにパーティション・レベルのパラメータ文字列が必要です。これらを取得するには、カートリッジによってディクショナリ表のXXX_IND_PARTITIONSビューをプログラム上で問い合せる必要があります。

    索引タイプにより、索引パーティション名を使用して記憶表およびそのパーティションに名前を割り当てることをお薦めします。また、XXX_IND_PARTITIONSビューから索引パーティション名をプログラム上で取得する必要があることに注意してください。

  2. 各パーティションでは、alter_option=AlterIndexRebuildを含むODCIIndexAlter()メソッドがコールされます。

    ODICEnv.IntermediateCallビットが設定されたかどうかを確認することにより、このODCIIndexAlter()コールがCREATE INDEXコールの一部として作成されたかどうかを検証できます。

    実表パーティションから各パーティションの索引列の値をプログラム上で選択し、それらを変換し、変換されたデータを対応するシステム・パーティション表に格納します。

    DML操作または問合せ操作の間、索引タイプによりメタデータ表を参照する必要がある場合、索引パーティションのオブジェクト識別子をメタデータ表の対応する行に挿入するようにプログラム化する必要があります。

    非パーティション表に値を格納するには、各パーティションに作成された初期ODCIIndexCreate()コールのレベル、またはODCIIndexAlter()コールのレベルのいずれかでカートリッジをプログラム化できます。

  3. ODCIIndexCreate()メソッドへの最終コールが作成され、索引タイプにより記憶表に必要なすべての索引が作成できます。

    CREATEルーチンでは、中間データの一時的な記憶表が使用される場合があります。オプションで、外部ファイルの使用をアプリケーションにプログラム上で指示できます。ただし、これらのファイルはアプリケーションにより管理されます。

    このODCIIndexCreate()コールの完了後、このコールによって作成され、削除されなかったすべてのパーティション表はシステムにより管理されます。

システム・パーティション索引記憶表にある各種グローバル索引の作成には、エラー・フラグが表示されることに注意してください。

INSERT、DELETEおよびUPDATEでのローカル・ドメイン索引のメンテナンス

DML操作は、次の方法で実装されます。

  1. ODCIIndexInsert()ODCIIndexDelete()またはODCIIndexUpdate()のうち1つが起動されます。索引パーティションのオブジェクト識別子(メターデータへのアクセス用)および実表パーティションの物理識別子(対応するパーティション内のDML実行用)は、ODICIndexInfo構造の一部として提供されます。

  2. システム・パーティション表にDMLを実装するには、カートリッジ・コードに次の構文を含める必要があります。システムにより、DATAOBJ_TO_PARTITION()関数が提供されます。

    INSERT INTO SP PARTITION
       (DATAOBJ_TO_PARTITION(base_table, :physical_partid)) VALUES(...)
    

ローカル・ドメイン索引の問合せ

次のステップに従ってローカル・ドメイン索引の問合せを実行します。

  1. オプティマイザがユーザー定義の演算子を含む問合せを受け取るときに、ドメイン索引スキャンを使用して評価するように定義されている場合、ODCIIndexStart()ODCIIndexFetch()またはODCIIndexClose()が起動されます。

  2. 索引パーティションのオブジェクト識別子および実表パーティションの物理識別子はODCIIndexInfo構造の一部として渡されます。

  3. 必要な場合は、索引パーティションのオブジェクト識別子を使用してメタデータ表を検索できます。

  4. また、実表パーティションの物理識別子を使用してシステム・パーティション表の対応するパーティションを問い合せることができます。

  5. カートリッジ・コードでは、システム・パーティション表を問い合せるために、次の構文と提供されたDATAOBJ_TO_PARTITION()関数を使用する必要があります。

    SELECT FROM SP PARTITION
       (DATAOBJ_TO_PARTITION(base_table, :physical_partid)) WHERE <..>;
    

システム管理ドメイン索引付けの制限事項

システム管理ドメイン索引付けのアプローチは次の構造をサポートします。

非パーティション索引の移行

次のステップに従って、非パーティション・ユーザー管理ドメイン索引をシステム管理ドメイン索引に移行します。

  1. メタデータを変更します。ALTER INDEXTYPEコマンドを発行して索引のプロパティをシステムに登録します。これにより統計タイプが分離されます。

  2. 索引にINVALIDマークが付けられます。ALTER INDEX ... COMPILEコマンドを暗黙的に発行し、索引を再検証する必要があります。これにより、alter_option=AlterIndexMigrateを含むODCIIndexAlter()メソッドがコールされます。

  3. ASSOCIATE STATISTICSコマンドを発行してシステム管理統計タイプをシステム管理索引タイプに関連付けます。

ローカル・パーティション索引の移行

次のステップに従って、ローカル・パーティション・ユーザー管理ドメイン索引をシステム管理パーティション・ドメイン索引に移行します。

  1. メタデータを変更します。ALTER INDEXTYPEコマンドを発行して新規の索引ルーチンおよび索引のプロパティを登録すると、システムによる管理が可能になります。この索引タイプのすべての索引にはINVALIDマークが付けられ、次のステップが完了するまで使用できません。これにより統計タイプは分離され、また古い統計を消去します。

  2. 索引データを変更します。ALTER INDEX ... COMPILEコマンドが、各索引の新規の索引タイプのために起動されます。これにより、alter_option=AlterIndexMigrateを含むODCIIndexAlter()メソッドがコールされます。このメソッドを実装して非パーティション表にあるグループをシステム・パーティション表に変換する必要があります。パーティション表を表すn表の各セットでは、カートリッジ・コードにより次のアクションが実行される必要があります。移行には索引データの再生成は必要ありませんが、交換操作のみが必要であることに注意してください。

    • システム・パーティション表の作成

    • n非パーティション表では、ALTER TABLE EXCHANGE PARTITION [INCLUDING INDEXES]ルーチンがコールされて非パーティション表をシステム・パーティション表のパーティションに交換します。

    • すべてのn非パーティション表を削除します。

  3. ASSOCIATE STATISTICSコマンドを発行してシステム管理統計タイプをシステム管理索引タイプに関連付けます。