A ユーザー管理ローカル・ドメイン索引

ドメイン索引のパーティション化のためのユーザー管理アプローチは、システム管理のパーティション化が導入されている場合にかぎり、Oracle Database 11gリリース1以前でのみ使用できる機能です。ユーザー管理アプローチには3つの重要な制限があります。

  • 拡張可能索引付けフレームワークにはカーネル内のドメイン索引の関連オブジェクトに関する情報が格納されないため、ユーザー指定のルーチンを使用して表およびパーティションのメンテナンスを行う必要があります。

  • 同一レベル・パーティション表がカーネルでサポートされていないため、各パーティションに一連の表および依存スキーマ・オブジェクトが存在する必要があります。また、これらをユーザー管理の索引付けコードを使用してプログラム上で管理する必要があります。

    パーティション数が増加するにつれてドメイン索引の格納オブジェクトが急増し、パフォーマンス面で問題となる場合があります。画像と1,000個のパーティションを持つ表を使用する場合、(ローカル・ドメイン索引をサポートするように拡張された)記憶表に64個のビットマップ索引を作成する索引スキーマでは、1,000個のドメイン索引記憶表と64,000個のビットマップ索引を作成および管理する必要があります。

  • 各パーティションに独自の表が存在するため、ローカル・ドメイン索引でDMLおよび問合せを処理している間は、各パーティションに個別にカーソルのセットが必要です。このため、多数のパーティションを使用し、同時に複数のパーティションへアクセスする必要があるアプリケーションでは、実行時に新しいSQLカーソルをコンパイルする必要があるので、パフォーマンスに影響が出る可能性があります。

「ドメイン索引の作成」で説明しているように、システム管理アプローチを使用することをお薦めします。

ユーザー管理アプローチは、将来のリリースで非推奨となる予定です。この付録では、ユーザー管理およびシステム管理の処理、およびAPIの違いについて説明しています。

A.1 ユーザー管理ドメイン索引とシステム管理ドメイン索引の比較

代替アプローチとして、システム管理のドメイン索引を使用します。これらの制限に対処し、次のようなメリットがあります。

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

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

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

A.2 ドメイン索引の切捨て

ドメイン索引を切り捨てるための明示的な文は存在しません。ただし、対応する表が切り捨てられるときには、索引タイプの切捨てメソッドがコールされます。次に例を示します。

TRUNCATE TABLE MyEmployees;

この例は、ODCIIndexTruncate()メソッドをコールしてResumeTextIndexを切り捨てます。

A.3 索引タイプの作成

次の構文を使用して、ユーザー管理ドメイン索引に対する索引タイプを作成します。

CREATE INDEXTYPE TextIndexType
FOR Contains (VARCHAR2, VARCHAR2)
USING TextIndexMethods;

A.4 索引タイプに対するドメイン索引の使用

ローカルドメイン索引を使用できる索引タイプに関しては、メソッドは、索引タイプが作成されると宣言されます。

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

A.5 ドメイン索引のパーティション化

ユーザー管理アプローチでは、メソッドODCIIndexMergePartition()およびODCIIndexSplitPartition()を使用してローカル・ドメイン索引がサポートされます。

A.6 ユーザー管理ドメイン索引に対するAPI

次のメソッドは、ドメイン索引のユーザー管理実装のみで使用されます。

A.6.1 ODCIIndexTruncate()

これは索引定義メソッドです。索引タイプで索引付けされた列またはオブジェクト型の属性を含む表に対してユーザーがTRUNCATE文を発行すると、OracleはODCIIndexTruncate()メソッドをコールします。このメソッドでは、ドメイン索引を空にしておく必要があります。

構文

FUNCTION ODCIIndexTruncate(
   ia ODCIIndexInfo, 
   env ODCIEnv) 
RETURN NUMBER
パラメータ 説明
ia

索引付けされた列に関する情報を含みます。

env

ルーチンに渡される環境ハンドル

戻り値

正常終了した場合はODCIConst.Success、エラーの場合はODCIConst.Error、それ以外の場合はODCIConst.Warning

ローカル・ドメイン索引の切捨て中は、最初のN+1回のコールでODCIConst.ErrContinueも戻すことができます。

使用上の注意

  • このファンクションは、静的な型のメソッドとして実装する必要があります。

  • このファンクションの実行後、ドメイン索引は空になります(空の実表に対応します)。

  • ODCIIndexTruncate()ルーチンの実行中は、ドメイン索引にLOADINGマークが付けられます。ODCIIndexTruncate()ルーチンがODCIConst.Error (または例外)を戻す場合、ドメイン索引にはFAILEDマークが付けられます。FAILEDのドメイン索引に対して許可される操作は、DROP INDEXTRUNCATE TABLEまたはALTER INDEX REBUILDのみです。ODCIIndexTruncate()ODCIConst.Warningを戻す場合、操作は成功しますがユーザーに警告メッセージが戻されます。

  • ODCIIndexTruncate()により実行される各SQL文は、独立した操作として処理されます。ODCIIndexTruncate()による変更がアトミックであるという保証はありません。

  • このメソッドは、非パーティション索引の切捨て、ローカル・ドメイン索引の切捨ておよびALTER TABLE TRUNCATE PARTITION実行中の単一索引パーティションの切捨てのためにコールされます。

    非パーティション索引を切り捨てる場合、IndexPartitionTablePartitionおよびcallPropertyNULLに設定された状態でODCIIndexTruncate()が起動されます。

    ローカル・ドメイン索引を切り捨てる場合、このルーチンはN+2回起動されます。Nはパーティション数です。

    ALTER TABLE TRUNCATE PARTITIONの実行中に単一索引パーティションを切り捨てる場合、このルーチンはIndexPartitionおよびTablePartitionが入力され、callPropertyNULLに設定された状態で起動されます。

関連項目:

ODCIIndexTruncate()

A.6.2 ODCIIndexMergePartition()

ドメイン索引が定義されているレンジ・パーティション表に対してALTER TABLE MERGE PARTITIONが発行されるときに起動されます。

構文

FUNCTION ODCIIndexMergePartition(
   ia ODCIIndexInfo, 
   part_name1 ODCIPartInfo, 
   part_name2 ODCIPartInfo, 
   parms VARCHAR2, 
   env ODCIEnv) 
RETURN NUMBER
パラメータ 説明
ia

一方のマージ対象パーティションの索引および表パーティション名を含みます。

part_name1

第2のマージ対象パーティションの索引および表パーティション名を含みます。

part_name2

新たにマージされた後のパーティションの索引および表パーティション名を保持します。

parms

マージ後のパーティションのパラメータ文字列(実際には、索引に関連付けられているデフォルトのパラメータ文字列)を含みます。

env

ルーチンに渡される環境ハンドル

戻り値

正常終了した場合はODCIConst.Success、エラーの場合はODCIConst.Error、それ以外の場合はODCIConst.Warning

使用上の注意

  • ファンクションは、静的な型のメソッドとして実装する必要があります。

  • マージ結果のパーティションを表す新規の表を作成し、マージしたパーティションのデータを移入する必要があります。次に、マージした索引パーティションに対応する表を削除します。

  • 新しく作成されるパーティションでは、索引レベルに関連付けられたデフォルトのパラメータ文字列が選択される必要があります。生成されたローカル索引パーティションは、UNUSABLEとマークされます。ALTER INDEX REBUILD PARTITIONがコールされるまで、新しいパーティションにデータを移入しようとしないでください。

  • 古い表および古い索引パーティションのディクショナリ・エントリは、ODCIIndexMergePartition()ヘのコール前に削除されるため、このルーチンのカートリッジ・コードは、このデータがビューに存在するかどうかに依存しないようにする必要があります。

A.6.3 ODCIIndexSplitPartition()

ドメイン索引が定義されているパーティション表に対してALTER TABLE SPLIT PARTITIONが起動されるときに起動されます。

構文

FUNCTION ODCIIndexSplitPartition(
   ia ODCIIndexInfo, 
   part_name1 ODCIPartInfo, 
   part_name2 ODCIPartInfo, 
   parms VARCHAR2, 
   env ODCIEnv) 
RETURN NUMBER
パラメータ 説明
ia

分割するパーティションに関する情報を含みます。

part_name1

一方の新規パーティションの索引および表パーティション名を保持します。

part_name2

他方の新規パーティションの索引および表パーティション名を保持します。

parms

新規パーティションのパラメータ文字列(分割される索引パーティションに関連した文字列)を含みます。

env

ルーチンに渡される環境ハンドル

戻り値

正常終了した場合はODCIConst.Success、エラーの場合はODCIConst.Error、それ以外の場合はODCIConst.Warning

使用上の注意

  • ファンクションは、静的な型のメソッドとして実装する必要があります。

  • 分割されたパーティションに対応するメタデータを削除して、新規に作成された2つのパーティションにメタデータを作成する必要があります。

  • 新規の表では、分割されるパーティションに関連付けられているデフォルトのパラメータ文字列を選択する必要があります。

  • 索引にはUNUSABLEマークが付けられるため、これらのパーティションに対応する索引データを計算する必要はありません。索引は、ALTER INDEX REBUILD PARTITIONコールが索引を再利用可能にした後で作成できます。

  • 古い表および古い索引パーティションのディクショナリ・エントリは、ODCIIndexSplitPartition()ヘのコール前に削除されるため、このルーチンのカートリッジ・コードは、このデータがビューに存在するかどうかに依存しないようにする必要があります。