8 ドメイン索引の作成

ドメイン索引とODCIIndexインタフェースについて考えます。ドメイン索引の使用方法、そのパーティション化、適用可能な制限および移行の手順を示します。

ユーザー管理ドメイン索引を使用している場合、それらの実装に固有の詳細は、「ユーザー管理ドメイン索引」を参照してください。

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

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

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

  • 中核部分は、ユーザーに代わってより多くのメンテナンス・タスクを実行するため、表およびパーティション・メンテナンス操作に対してプログラムによるサポートをする必要がありません。これらの操作はサーバーで操作すると実装されるので、ユーザーは最小限のセットのユーザー定義インタフェース・ルーチンでコード化できます。カートリッジ・コードは比較的パーティションの問題から影響を受けません。

  • ローカル・パーティション・ドメイン索引をサポートするために管理する必要のあるオブジェクトの数は、非パーティション・ドメイン索引の場合と同じです。ローカル・パーティション索引の場合、ドメイン索引の索引記憶表は実表とともにパーティション化されるので(システム・パーティション表を使用)、パーティションの数が増加してもドメイン索引の索引記憶表の数は増加しません。

  • 問合せとDML文の1セットがアクセス可能になり、システム・パーティション記憶表を操作し、カーソルの共有を容易にしてパフォーマンスを強化します。

新しいアプリケーションの開発には、ユーザー管理ドメイン索引ではなくシステム管理ドメイン索引を使用することをお薦めします。

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

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

  • 索引の作成やスキャンなど、索引タイプの動作を実装するメソッド

  • Contains()Overlaps()など、索引タイプでサポートされる演算子

索引タイプを作成するには、次のステップを実行する必要があります。

  • サポートされる演算子を定義し、それを実装するファンクションを作成します。

  • ODCIIndexインタフェースを実装するメソッドを作成し、それをカプセル化するタイプ(実装タイプ)を定義します。

  • 実装タイプを指定し、演算子と演算子バインディングをリストして、索引タイプを作成します。

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

  • インタフェースは、個別のスキーマ・オブジェクトではなく、記述されたメソッド指定の論理セットを意味します。

  • ODCIIndexインタフェースは、索引定義、メンテナンスおよびスキャン・ルーチンの指定のセットを意味します。

関連項目:

演算子の定義

8.2 ODCIIndexインタフェース

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

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

  • 索引定義メソッド

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

  • 索引スキャン・メソッド

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

関連項目:

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

8.2.1 索引定義メソッド

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

8.2.1.1 ODCIIndexCreate()

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

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

8.2.1.2 ODCIIndexAlter()

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

8.2.1.3 ODCIIndexDrop()

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

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

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

8.2.2.1 ODCIIndexInsert()

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

8.2.2.2 ODCIIndexDelete()

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

8.2.2.3 ODCIIndexUpdate()

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

8.2.3 索引スキャン・メソッド

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

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

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

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

8.2.3.1 ODCIIndexStart()

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

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

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

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

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

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

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

関連項目:

8.2.3.2 ODCIIndexFetch()

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

8.2.3.3 ODCIIndexClose()

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

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

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

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

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

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

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

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

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

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

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

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

  1. 索引構成表の作成

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

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

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

関連項目:

ODCIIndexCreate()

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

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

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

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

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

関連項目:

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

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

索引タイプを操作するSQL文について考えてみます。

関連項目:

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

8.3.1 索引タイプの作成

ODCIIndexインタフェースを実装して実装タイプを定義した後、索引タイプでサポートされる演算子のリストを指定し、索引インタフェースを実装するタイプを参照して、新規の索引タイプを作成できます。情報検索の例では、新規の索引タイプTextIndexTypeを定義するDDL文は、例8-1のようになります。この索引タイプはContains演算子をサポートし、その実装は型TextIndexMethodsで提供されます。

実装タイプでは、ODCIIndexインタフェース・ルーチンのみでなくODCIGetInterfaces()ルーチンも実装する必要があります。このルーチンにより実装タイプで実装されたインタフェースのバージョンが戻されます。Oracleは、CREATE INDEXTYPEの実行時にODCIGetInterfaces()ルーチンをコールします。

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

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

8.3.2 索引タイプの削除

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

DROPのデフォルトの動作はDROP RESTRICTセマンティクスです。つまり、その索引タイプを使用するドメイン索引が1つ以上ある場合は、DROP操作を実行できません。このデフォルトの動作をオーバーライドするには、FORCEオプションを使用します。これにより、索引タイプが削除され、依存するすべてのドメイン索引に無効のマークが付けられます。

関連項目:

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

例8-2 索引タイプの削除

DROP INDEXTYPE TextIndexType;

8.3.3 索引タイプへのコメントの付加

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

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

例8-3 索引タイプへのコメントの付加

COMMENT ON INDEXTYPE
TextIndexType IS 'implemented by the type TextIndexMethods to support the Contains operator';
8.3.3.1 索引タイプのコメント

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

  • ALL_INDEXTYPE_COMMENTSは、現行のユーザーがアクセスできるユーザー定義の索引タイプに関するコメントを示します。

  • DBA_INDEXTYPE_COMMENTSは、データベース内のユーザー定義のすべての索引タイプに関するコメントを示します。

  • USER_INDEXTYPE_COMMENTSは、現行のユーザーが所有するユーザー定義の索引タイプに関するコメントを示します。

表8-1 ビュー*_INDEXTYPE_COMMENTS

データ型 必須 説明
OWNER
VARCHAR2(30)
NOT NULL

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

INDEXTYPE_NAME
VARCHAR2(30)
NOT NULL

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

COMMENT
VARCHAR2(4000)
 

ユーザー定義の索引タイプに関するコメント

8.4 ドメイン索引

ドメイン索引の操作と、ドメイン索引に関連付けられたメタデータを取得する方法について考えます。

8.4.1 ドメイン索引の操作

ドメイン索引の作成、変更、切捨ておよび削除を行う方法について考えます。

8.4.1.1 ドメイン索引の作成

ドメイン索引は、Bツリー索引と同様に表の1列に作成できます。ただし、索引タイプを明示的に指定する必要があります。例8-4は、例7-1で宣言したMyEmployees表に索引タイプを指定する方法を示しています。

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

例8-4 ドメイン索引の作成

CREATE INDEX ResumeTextIndex ON MyEmployees(resume)
INDEXTYPE IS TextIndexType
PARAMETERS (':Language English :Ignore the a an');
8.4.1.2 ドメイン索引の変更

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

例8-5 ドメイン索引の変更

ALTER INDEX ResumeTextIndex PARAMETERS (':Ignore on');
8.4.1.3 ドメイン索引の名前の変更

ALTER文を例8-6のように使用すると、ドメイン索引の名前を変更できます。

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

例8-6 ドメイン索引の名前の変更

ALTER INDEX ResumeTextIndex RENAME TO ResumeTIdx;
8.4.1.4 ドメイン索引の再作成

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

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

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

例8-7 ドメイン索引の再作成

ALTER INDEX ResumeTextIndex REBUILD PARAMETERS (':Ignore off');
8.4.1.5 ドメイン索引の切捨て

ドメイン索引を切り捨てるための明示的な文は存在しません。ただし、対応する実表が切り捨てられる場合は、ドメイン索引の基礎となる記憶表も切り捨てられます。また、例8-8のコマンドによってODCIIndexAlter()が呼び出され、ResumeTextIndexが切捨てられます。これは、そのalter_optionAlterIndexRebuildに設定されているためです。

例8-8 ドメイン索引の切捨て

TRUNCATE TABLE MyEmployees;
8.4.1.6 ドメイン索引の削除

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

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

例8-9 ドメイン索引の削除

DROP INDEX ResumeTextIndex;

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

索引タイプによって索引構成表にドメイン索引が作成されるときに発生するいくつかの問題について考えます。ODCIIndexInfo構造内でIndexInfoFlagsIndexOnIOTビットを使用すると、実表がIOTかどうかを判別できます。

8.4.2.1 UROWID列でのROWIDの格納について

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

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

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

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

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

8.4.2.2 UROWID列のサイズの判断

例8-10 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;
8.4.2.3 索引記憶表に対するDML

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

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

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

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

8.4.2.5 一意でない列の索引

主キー列の値はすべて一意である必要があるため、表の一意でない列に定義されているドメイン索引は、索引を格納するために使用されている基礎となるIOTの主キーとして、この列を使用できません。この問題を回避するには、一意の連番を保持するために、索引データを含むIOTに列を追加します。列の値が表に挿入されるときに、対応する一意の連番を生成します。これにより、連番が付けられた索引付きの列を、IOTの主キーとして使用できるようになります。(UROWID列はIOTの主キーの一部にすることはできないため、連番の列をUROWIDにすることはできません。)また、このアプローチにより、IOTの主な利点である主キー列の値への高速アクセスも維持されます。

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

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

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

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

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

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

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

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

関連項目:

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

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

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

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

関連項目:

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

8.4.6 ドメイン索引のビュー

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

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

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

  • USER_SECONDARY_OBJECTSは、現行のユーザーが所有するドメイン索引に関連するセカンダリ・オブジェクトに関する情報を示します。

表8-2 ビュー*_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-11では、例8-4で作成されたResumeTextIndexに関する情報をUSER_SECONDARY_OBJECTSビューを使用して取得する方法を示します。

例8-11 *_SECONDARY_OBJECTSビューの使用

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

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

ドメイン索引で使用されるオブジェクトに影響する問題について考えます。

8.5.1 オブジェクトの依存性

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

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

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

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

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

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

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

  2. 演算子

  3. 索引タイプ

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

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

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

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

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

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

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

ファンクション

FORCE

なし

パッケージ

FORCE

なし

オブジェクト型

RESTRICT

FORCE

演算子

RESTRICT

FORCE

索引タイプ

RESTRICT

FORCE

8.5.3 オブジェクトの検証

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

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

  • 演算子と演算子バインディングを作成するには、CREATE OPERATORまたはCREATE ANY OPERATOR権限に加えて、ファンクション、演算子、パッケージまたは参照される型に対するEXECUTE権限が必要です。

  • 索引タイプを作成するには、CREATE INDEXTYPEまたはCREATE ANY INDEXTYPE権限に加えて、索引タイプを実装する型に対するEXECUTE権限が必要です。また、索引タイプでサポートする演算子に対するEXECUTE権限も必要です。

  • 独自スキーマ内で索引タイプを変更するには、CREATE INDEXTYPEシステム権限が必要です。

  • 他のユーザーのスキーマ内で索引タイプまたは演算子を変更するには、ALTER ANY INDEXTYPEまたはALTER ANY OPERATORシステム権限が必要です。

  • ドメイン索引を作成するには、CREATE INDEXまたはCREATE ANY INDEX権限に加えて、索引タイプに対するEXECUTE権限が必要です。

  • ドメイン索引を変更するには、索引タイプに対するEXECUTE権限が必要です。

  • 問合せまたはDML文に演算子を使用するには、演算子と関連ファンクション、パッケージおよび索引タイプに対するEXECUTE権限が必要です。

  • 実装タイプを変更するには、新規の実装タイプに対するEXECUTE権限が必要です。

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

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

注意:

ALTER TABLE MODIFY PARTITION BY文を使用して、グローバル・ドメイン索引をローカル・ドメイン索引に変換することはできません。

また、ALTER TABLE MODIFY PARTITION BY文を使用して、ドメイン索引が定義された表のパーティション化スキームを変更することもできません。

8.7.1 ローカル・ドメイン索引メソッドの使用

ローカル・ドメイン索引は、基礎となる表と同一レベルでパーティション化されます。つまり、ローカル・ドメイン索引内のキーはすべて、対応する表パーティションに格納される行を参照します。他のパーティションの行を参照するキーはありません。例8-12のように、CREATE INDEXTYPE文を呼び出して、索引タイプでローカル・ドメイン索引を指定できます。

この文では、実装タイプTextIndexMethodsでローカル・ドメイン索引を作成してメンテナンスできるように指定しています。

例8-12 索引タイプ内でのローカル・ドメイン索引メソッドの使用

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

8.7.2 パーティション索引について

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

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

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

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

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

例8-13 索引の作成とパーティション化

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

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

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

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

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

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

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

例8-15 ローカル索引パーティションの削除

DROP INDEX ResumeIndex;

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

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

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

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

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

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

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

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

8.7.6 索引の状態の概要

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

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

状態 説明

IN_PROGRESS

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

FAILED

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

UNUSABLE

通常の索引と同じ。パーティションに対する特定のメンテナンス操作の結果として、パーティション表の索引がUNUSABLEとマークされます。ただし、パーティション索引の場合は、UNUSABLEが索引全体ではなく索引パーティションにのみ関連付けられます。

VALID

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

INVALID

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

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

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

8.7.8 索引に影響する表操作

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

表8-5 表操作の概要

表操作 説明

DROPtable

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

TRUNCATEtable

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

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

ALTER TABLE操作 説明

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

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

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

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

パーティションの追加

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

パーティションの結合

ハッシュ・パーティション表にのみ適用されます。実表のパーティションを削除します。関連するローカル索引パーティションも削除されます。

パーティションの削除

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

パーティションの切捨て

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

パーティションの移動

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

パーティションの分割

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

パーティションのマージ

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

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

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

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

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

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

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

8.7.10 ドメイン索引に対するSQL*Loaderの使用

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

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

  1. ドメイン索引を削除します。
  2. SQL*Loaderでダイレクト・パス・ロードを実行します。
  3. ドメイン索引を再作成します。

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

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

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

関連項目:

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

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

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

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

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

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

システムのパーティション化の実装方法について考えます。

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

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

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

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.8.2.2 システム・パーティション表へのデータの挿入

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

Oracle Database 12c以降では、例8-19に示すように、DATAOBJ_TO_PARTITIONファンクションではなくDATAOBJ_TO_MAT_PARTITIONを使用することをお薦めします。DATAOBJ_TO_MAT_PARTITIONファンクションでは、時間隔パーティション表上のローカル・ドメイン索引がサポートされています。

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

例8-18に示すDATAOBJ_TO_PARTITIONファンクションは、物理識別子を使用して絶対パーティション番号を判断します。ただし、実表が時間隔パーティション表の場合、対応する非マテリアライズド・パーティションのパーティション番号にホールがある可能性があります。これは、システム・パーティション表がマテリアライズド・パーティションのみを持ち、実表のパーティションと基礎となるシステム・パーティション索引の記憶域表のパーティションとの間で、DATAOBJ_TO_PARTITION番号で不一致が発生する場合があるためです。

例8-19に示す新しいファンクションDATAOBJ_TO_MAT_PARTITIONは、(絶対パーティション番号ではなく)マテリアライズド・パーティション番号を返し、2つの表が同期を維持できるようにします。この関数を使用するには、時間隔パーティション表上のローカル・ドメイン索引をサポートする予定の索引型を移行する必要があります。

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

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

例8-18 システム・パーティション表へのデータの挿入(DATAOBJ_TO_PARTITION)

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

例8-19 システム・パーティション表へのデータの挿入(DATAOBJ_TO_MAT_PARTITION)

INSERT INTO SystemPartitionedTable PARTITION 
  (DATAOBJ_TO_MAT_PARTITION (base_table, :physical_partid)) 
  VALUES (...);
8.8.2.3 システム・パーティション表でのデータの削除および更新

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

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

システムのパーティション化で引き続きサポートされる操作は次のとおりです。

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

    • ALTER INDEX SPLIT PARTITION

    • ALTER TABLE SPLIT PARTITION

    • SELECTでのCREATE TABLE

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

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

  • グローバル索引の作成

  • すべてのDML操作

  • パーティション拡張構文を使用したINSERT AS SELECT操作(次のコード例参照)

    表の特定のパーティションへのデータの挿入

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

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

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

  • INSERT INTO TableName AS SubQuery

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

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

  1. 追加または削除されるパーティションの情報を使用して、ODCIIndexUpdPartMetadata()メソッドが起動されます。1対2の分割には、1つのパーティションの削除と2つの新規パーティションの追加が必要です。
  2. 影響を受けるパーティションでODCIStatsUpdPartStatistics()が起動されます。
  3. すべてのシステム・パーティション索引および統計記憶表から分割されたパーティションが削除されます。
  4. システム・パーティション表に2つの新規のパーティションが追加されます。
  5. 分割されるパーティションが空の場合、最初のODCIIndexAlter()へのコールで分割パーティションが再作成され、2番目のODCIIndexAlter()へのコールで新しく追加されたパーティションが再作成されます。

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

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

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

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

注意:

ALTER TABLE EXCHANGE PARTITION CASCADEコマンドは、参照パーティション表にローカル・ドメイン索引がある場合は使用できません。

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

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

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

システム管理ドメイン索引が機能する仕組み、その統計の収集および保管方法、それらの使用に関する制限事項について考えます。

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

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

  • 3つのパーティション

  • IT1(表の1つの列上のローカル・ドメイン索引)

  • MT1(メタデータ・オブジェクトに対応する表で、ローカル・ドメイン索引の各パーティションに固有の情報を格納するために索引タイプにより作成されたオプションのメタデータ表)

  • SPT1(索引データを格納するために索引タイプにより作成されたシステム・パーティション表)

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

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

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

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

  • 実表T1内のパーティションP2P21およびP22に分割します。

  • ローカル・ドメイン索引で、パーティションIP2が削除され、2つの新規パーティション、IP21およびIP22が作成されます。

  • 索引タイプにより、メタデータ表MT1を必要に応じて更新するODCIIndexUpdPartMetadata()メソッドが起動されます。

  • システム・パーティション表SPT1で、パーティションIP2に対応するパーティションは削除され、2つの新規パーティションが作成されます。

  • 分割操作の結果、索引パーティションにUNUSABLEマークが付けられ、USABLEになるように再作成されます。

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

図8-2の説明が続きます
「図8-2 ALTER TABLE SPLIT PARTITIONの後の3つのパーティションの表」の説明

例8-20 既存の表パーティションの分割

ALTER TABLE T1 SPLIT PARTITION P2 INTO P21, P22

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

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

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

  • ODCIIndexXXX () DMLおよび問合せでは、索引パーティションのオブジェクト識別子(ODCIIndexInfo.IndexPartitionIden)および実表パーティションの物理識別子(ODIIndexInfo.IndexCols(1).TablePartitionIden)の両方が必要です。ODCIIndexXXX () DDLルーチンでは、索引パーティションのオブジェクト識別子と索引パーティション名の両方が提供されます。

  • CREATE INDEXルーチンでは、ODCIIndexCreate()に対して2つのコール(1つは開始時で、もう1つは終了時)を使用し、alter_option=AlterIndexRebuildのあるODCIIndexAlter()に対してはパーティションの数と同数のコールを使用します。

  • TRUNCATE TABLEルーチンでは、alter_option=AlterIndexRebuildのあるODCIIndexAlter()に対してパーティションの数と同数のコールを使用します。

  • すべてのパーティション・メンテナンス操作では、索引タイプがパーティション・メタデータ表を正しく更新できるように、ODCIIndexUpdPartMetadata()が起動されます。索引パーティションのリストは、索引パーティション名と索引パーティションのオブジェクト識別子によって指定され、パーティションの追加または削除に関する情報が提供されます。これらのコールではDDLを使用できません。各パーティション・メンテナンス操作では、ドメイン索引を使用して作成されたシステム・パーティションの記憶表が、システムによって暗黙的に変換されます。新しく生成されるパーティションの名前は、索引パーティション名に対応しています。

  • システム・パーティション表を使用してパーティション・レベルの統計を格納する場合は、ODCIStatsCollect()によって作成され、ODCIStatsDelete()によって削除される表および索引がシステムによって追跡され、同一レベルのパーティション化が維持されます。

  • アプリケーションにユーザー定義のパーティション・レベルの統計が実装されている場合は、パーティション・メンテナンス操作ごとにODCIStatsUpdPartStatistics()が起動されます。これにより、統計タイプによるパーティション・レベルの統計とオプションでのグローバル集計統計の更新が確実になります。これらのコールでは、DDLは許可されません。ODCIStatsUpdPartStatistics()が実装されていない場合は例外が発生せず、次のプログラムのステップに進みます。

8.10.1 非パーティション・ドメイン索引に対するメソッド

表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

(強制)

ODCIIndexDrop()およびODCIStatsDelete()

INSERT

ODCIIndexInsert()

DELETE

ODCIIndexDelete()

UPDATE

ODCIIndexUpdate()

QUERY

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

8.10.2 ローカル・システム管理ドメイン索引に対するメソッド

表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

(強制)

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

ALTER TABLE ADD PARTITION

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

ALTER TABLE COALESCE PARTITION

ODCIIndexUpdPartMetadata()

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

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()

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

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

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

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

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

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

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

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

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

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

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

    CREATEルーチンでは、中間データ用に一時記憶表を使用できます。必要に応じ、外部ファイルを使用するようアプリケーションにプログラム上で指示することもできます。その場合は、アプリケーションがこれらのファイルの管理を担当します。

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

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

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

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

  1. ODCIIndexInsert()ODCIIndexDelete()またはODCIIndexUpdate()のうち1つが起動されます。索引パーティションのオブジェクト識別子(メターデータへのアクセス用)および実表パーティションの物理識別子(対応するパーティション内のDML実行用)は、ODICIndexInfo構造の一部として提供されます。
  2. システム・パーティション表にDMLを実装するには、カートリッジ・コードに次のコード例の構文を含める必要があります。システムにより、DATAOBJ_TO_PARTITION_()ファンクションが提供されます。

    システム・パーティション表でのDML操作のコール

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

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

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

  1. オプティマイザがユーザー定義の演算子を含む問合せを受け取るときに、ドメイン索引スキャンを使用して評価するように定義されている場合、ODCIIndexStart()ODCIIndexFetch()またはODCIIndexClose()が起動されます。
  2. 索引パーティションのオブジェクト識別子および実表パーティションの物理識別子はODCIIndexInfo構造の一部として渡されます。
  3. 必要な場合は、索引パーティションのオブジェクト識別子を使用してメタデータ表を検索できます。
  4. また、実表パーティションの物理識別子を使用してシステム・パーティション表の対応するパーティションを問い合せることができます。
  5. カートリッジ・コードでは、次のコード例で示した構文と、提供されたファンクションDATAOBJ_TO_MAT_PARTITION()を使用して、システム・パーティション表を問い合せる必要があります。

    システム・パーティション表の問合せ

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

8.14 システム管理ドメイン索引-サポートされているスキーム

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

  • 非パーティション化システム管理ドメイン索引。

  • レンジ・パーティション表、リスト・パーティション表、ハッシュ・パーティション表、時間隔パーティション表、自動リスト・パーティション表およびコンポジット・パーティション表のローカル索引。

  • 参照パーティション表のルート表が、レンジ・パーティション化、リスト・パーティション化、ハッシュ・パーティション化、時間隔パーティション化、レンジ・コンポジット・パーティション化、リスト・コンポジット・パーティション化またはハッシュ・コンポジット・パーティション化されている場合の、参照パーティション表のローカル索引。

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

  • システム管理ドメイン索引で索引付けできるのは1列のみです。

  • ローカル・ドメイン索引は、REFパーティション表またはIOTに対して作成できません。

  • 参照パーティション表のルート表が、時間隔コンポジット・パーティション化または時間隔サブパーティション化されている場合は、参照パーティション表上のローカル・ドメイン索引がサポートされません。

  • ローカル・ドメイン索引は、時間隔コンポジット、時間サブパーティション、自動リスト・コンポジットまたは自動リスト・サブパーティション表ではサポートされません。

  • ビットマップまたは一意のドメイン索引は指定できません。

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

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

  1. メタデータを変更します。ALTER INDEXTYPEコマンドを発行して、索引タイプのプロパティをシステムに登録します。これにより、統計タイプの関連付けが解除されます。
  2. 索引にINVALIDマークが付けられます。ALTER INDEX ... COMPILEコマンドを暗黙的に発行し、索引を再検証する必要があります。これにより、alter_option=AlterIndexMigrateを含むODCIIndexAlter()メソッドがコールされます。
  3. ASSOCIATE STATISTICSコマンドを発行してシステム管理統計タイプをシステム管理索引タイプに関連付けます。

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

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

  1. メタデータを変更します。ALTER INDEXTYPEコマンドを発行して、新しい索引ルーチンと索引タイプのプロパティを登録することで、システムで管理できるようにします。この索引タイプのすべての索引がINVALIDとマークされ、次のステップが完了するまで使用できなくなります。これにより、統計タイプの関連付けが解除され、古い統計が消去されます。
  2. 索引データを変更します。各索引の新しい索引タイプに対してALTER INDEX ... COMPILEコマンドを起動します。これにより、alter_option=AlterIndexMigrateを含むODCIIndexAlter()メソッドがコールされます。非パーティション表のグループをシステム・パーティション表に変換するには、このメソッドを実装する必要があります。パーティション表を表すn個の表の各セットに対して、カートリッジ・コードで次の処理を実行する必要があります。移行に際して索引データを再生成する必要はなく、交換操作のみ必要になります。
    • システム・パーティション表の作成

    • n個の非パーティション表ごとにALTER TABLE EXCHANGE PARTITION [INCLUDING INDEXES]ルーチンをコールして、非パーティション表をシステム・パーティション表のパーティションに交換

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

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