ドメイン索引のパーティション化のためのユーザー管理アプローチは、システム管理のパーティション化が導入されている場合にかぎり、Oracle Database 11gリリース1以前でのみ使用できる機能です。ユーザー管理アプローチには3つの重要な制限があります。
拡張可能索引付けフレームワークにはカーネル内のドメイン索引の関連オブジェクトに関する情報が格納されないため、ユーザー指定のルーチンを使用して表およびパーティションのメンテナンスを行う必要があります。
同一レベル・パーティション表がカーネルでサポートされていないため、各パーティションに一連の表および依存スキーマ・オブジェクトが存在する必要があります。また、これらをユーザー管理の索引付けコードを使用してプログラム上で管理する必要があります。
パーティション数が増加するにつれてドメイン索引の格納オブジェクトが急増し、パフォーマンス面で問題となる場合があります。画像と1,000個のパーティションを持つ表を使用する場合、索引スキーマ(ローカル・ドメイン索引をサポートするように拡張されている)により記憶表に64個のビットマップ索引が作成されるので、1,000個のドメイン索引記憶表と64,000個のビットマップ索引を作成および管理する必要があります。
各パーティションに独自の表が存在するため、ローカル・ドメイン索引でDMLおよび問合せを処理している間は、各パーティションに個別にカーソルのセットが必要です。このため、多数のパーティションを使用し、同時に複数のパーティションへアクセスする必要があるアプリケーションでは、実行時に新しいSQLカーソルをコンパイルする必要があるので、パフォーマンスに影響が出る可能性があります。
第8章「ドメイン索引の作成」で説明しているように、システム管理アプローチを使用することをお薦めします。
ユーザー管理アプローチは、将来のリリースで非推奨となる予定です。この付録では、ユーザー管理およびシステム管理の処理、およびAPIの違いについて説明しています。
代替アプローチとして、システム管理のドメイン索引を使用します。これらの制限に対処し、次のようなメリットがあります。
中核部分は、ユーザーに代わってより多くのメンテナンス・タスクを実行するため、表およびパーティション・メンテナンス操作に対してプログラムによるサポートをする必要がありません。これらの操作はサーバーで操作し、最小限のセットのインタフェース・ルーチンを使用して、実装できます。カートリッジ・コードは比較的パーティションの問題から影響を受けません。
ローカル・パーティション・ドメイン索引をサポートするために管理する必要のあるオブジェクトの数は、非パーティション索引の場合と同じです。ローカル・パーティション索引の場合、ドメイン索引の索引記憶表は実表とともにパーティション化されるので、パーティションの数が増加してもドメイン索引の索引記憶表の数は増加しません。
問合せとDML文の1セットがアクセス可能になり、システム・パーティション記憶表を操作し、カーソルの共有を容易にしてパフォーマンスを強化します。
ドメイン索引を切り捨てるための明示的な文は存在しません。ただし、対応する表が切り捨てられるときには、索引タイプの切捨てメソッドがコールされます。次に例を示します。
TRUNCATE TABLE Employees;
この例は、ODCIIndexTruncate()メソッドをコールしてResumeTextIndex
を切り捨てます。
次の構文を使用して、ユーザー管理ドメイン索引に対する索引タイプを作成します。
CREATE INDEXTYPE TextIndexType FOR Contains (VARCHAR2, VARCHAR2) USING TextIndexMethods;
ローカルドメイン索引を使用できる索引タイプに関しては、メソッドは、索引タイプが作成されると宣言されます。
CREATE INDEXTYPE TextIndexType FOR Contains (VARCHAR2, VARCHAR2) USING TextIndexMethods WITH LOCAL RANGE PARTITION;
ユーザー管理アプローチでは、メソッドODCIIndexMergePartition()およびODCIIndexSplitPartition()を使用してローカル・ドメイン索引がサポートされます。
次のメソッドは、ドメイン索引のユーザー管理実装のみで使用されます。
これは索引定義メソッドです。索引タイプで索引付けされた列またはオブジェクト型の属性を含む表に対してユーザーが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
INDEX
、TRUNCATE
TABLE
またはALTER
INDEX
REBUILD
のみです。ODCIIndexTruncate()がODCIConst
.Warning
を戻す場合、操作は成功しますがユーザーに警告メッセージが戻されます。
ODCIIndexTruncate()により実行される各SQL文は、独立した操作として処理されます。ODCIIndexTruncate()による変更がアトミックであるという保証はありません。
このメソッドは、非パーティション索引の切捨て、ローカル・ドメイン索引の切捨ておよびALTER TABLE TRUNCATE PARTITION
実行中の単一索引パーティションの切捨てのためにコールされます。
非パーティション索引を切り捨てる場合、IndexPartition
、TablePartition
およびcallProperty
がNULL
に設定された状態でODCIIndexTruncate()が1度起動されます。
ローカル・ドメイン索引を切り捨てる場合、このルーチンはN+2回起動されます。Nはパーティション数です。
ALTER TABLE TRUNCATE PARTITION
の実行中に単一索引パーティションを切り捨てる場合、このルーチンはIndexPartition
およびTablePartition
が入力され、callProperty
がNULL
に設定された状態で1度起動されます。
ドメイン索引が定義されているレンジ・パーティション表に対して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()ヘのコール前に削除されるため、このルーチンのカートリッジ・コードは、このデータがビューに存在するかどうかに依存しないようにする必要があります。
ドメイン索引が定義されているパーティション表に対して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()ヘのコール前に削除されるため、このルーチンのカートリッジ・コードは、このデータがビューに存在するかどうかに依存しないようにする必要があります。