8 ドメイン索引の作成
ドメイン索引とODCIIndex
インタフェースについて考えます。ドメイン索引の使用方法、そのパーティション化、適用可能な制限および移行の手順を示します。
ユーザー管理ドメイン索引を使用している場合、それらの実装に固有の詳細は、「ユーザー管理ドメイン索引」を参照してください。
8.1 索引タイプとドメイン索引の概要
ドメイン索引とは、空間処理やイメージ処理など、特化されたドメイン向けに設計された索引です。設計者が索引タイプを作成した後、ユーザーがタイプを指定してドメイン索引を作成できます。ドメイン索引とは、業界、業務またはその他の特別な用途に固有の動作を持つ索引で、カートリッジ開発中に指定する必要があります。
ドメイン索引へのシステム管理アプローチはOracle Database 11gリリース1で新しく追加された機能で、プログラムの負荷を軽減し、従来のユーザー管理ドメイン索引よりも適切なパフォーマンスを提供します。ユーザー管理アプローチの制限に対処し、次のようなメリットがあります。
-
中核部分は、ユーザーに代わってより多くのメンテナンス・タスクを実行するため、表およびパーティション・メンテナンス操作に対してプログラムによるサポートをする必要がありません。これらの操作はサーバーで操作すると実装されるので、ユーザーは最小限のセットのユーザー定義インタフェース・ルーチンでコード化できます。カートリッジ・コードは比較的パーティションの問題から影響を受けません。
-
ローカル・パーティション・ドメイン索引をサポートするために管理する必要のあるオブジェクトの数は、非パーティション・ドメイン索引の場合と同じです。ローカル・パーティション索引の場合、ドメイン索引の索引記憶表は実表とともにパーティション化されるので(システム・パーティション表を使用)、パーティションの数が増加してもドメイン索引の索引記憶表の数は増加しません。
-
問合せとDML文の1セットがアクセス可能になり、システム・パーティション記憶表を操作し、カーソルの共有を容易にしてパフォーマンスを強化します。
新しいアプリケーションの開発には、ユーザー管理ドメイン索引ではなくシステム管理ドメイン索引を使用することをお薦めします。
索引タイプにより、テキスト、空間およびイメージ処理などの複合ドメインに使用する検索および取出しメソッドがカプセル化されます。索引タイプは、Oracle Databaseで提供される索引に類似しています。ただし、索引タイプを実装するアプリケーション・ソフトウェアを提供するのがユーザーであるという違いがあります。
索引タイプには、次の2つの主要コンポーネントがあります。
-
索引の作成やスキャンなど、索引タイプの動作を実装するメソッド
-
Contains()
やOverlaps()
など、索引タイプでサポートされる演算子
索引タイプを作成するには、次のステップを実行する必要があります。
-
サポートされる演算子を定義し、それを実装するファンクションを作成します。
このコンテキストでの意味は、次のとおりです。
-
インタフェースは、個別のスキーマ・オブジェクトではなく、記述されたメソッド指定の論理セットを意味します。
-
ODCIIndex
インタフェースは、索引定義、メンテナンスおよびスキャン・ルーチンの指定のセットを意味します。
関連項目:
8.2 ODCIIndexインタフェース
ODCIIndex
インタフェースでは、索引タイプを実装するために提供する必要のあるルーチンがすべて指定されます。各ルーチンは、型のメソッドとして実装する必要があります。
ODCIIndex
インタフェースは、次のメソッド・クラスで構成されています。
-
索引定義メソッド
-
索引メンテナンス・メソッド
-
索引スキャン・メソッド
-
索引メタデータ・メソッド
関連項目:
メソッドのシグネチャとパラメータの説明は、「拡張可能索引付けインタフェース」を参照してください。
8.2.1 索引定義メソッド
アプリケーションは、ユーザーが索引タイプの索引に対してCREATE
、ALTER
、DROP
または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.2 索引メンテナンス・メソッド
索引タイプで索引付けされた列またはオブジェクト型の属性を含む表に対して、ユーザーがINSERT
、UPDATE
および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
パラメータが渡され、これを介して状態データにアクセスできます。
関連項目:
-
メモリー・サービスとコンテキストのメンテナンスの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
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次索引の作成
ODCIIndexCreate()
でDDL文とDML文の任意の順序を実行できるように、各文が独立した操作とみなされます。そのため、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.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_option
がAlterIndexRebuild
に設定されているためです。
例8-8 ドメイン索引の切捨て
TRUNCATE TABLE MyEmployees;
8.4.1.6 ドメイン索引の削除
ドメイン索引のインスタンスを削除するには、例8-9に示すようにDROP
INDEX
文を使用します。
この例では、ODCIIndexDrop()メソッドがコールされ、索引に関する情報が渡されます。
例8-9 ドメイン索引の削除
DROP INDEX ResumeTextIndex;
8.4.2 索引構成表のドメイン索引
索引タイプによって索引構成表にドメイン索引が作成されるときに発生するいくつかの問題について考えます。ODCIIndexInfo
構造内でIndexInfoFlags
のIndexOnIOT
ビットを使用すると、実表が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 INSERT
、UPDATE
およびDELETE
文でROWIDバインド変数の型を変更する必要があります。渡されるROWID引数をテキスト文字列に変換し、テキスト文字列としてバインドする方法は、物理ROWIDとユニバーサルROWIDの両方で機能します。この方法により、標準の表とIOTの両方を処理する索引タイプをコーディングできます。
8.4.2.4 索引記憶表に対する開始、フェッチおよびクローズ操作
Start
、Fetch
および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()
が存在する場合、これらが起動され、ドメイン索引に関連付けられているセカンダリ・オブジェクトがエクスポート/インポート操作に含まれるかどうかを判別します。
関連項目:
-
エクスポート/インポートの使用方法は、『Oracle Databaseユーティリティ』を参照してください。
8.4.5 トランスポータブル表領域を使用したドメイン索引の移動
トランスポータブル表領域機能を使用すると、Oracleデータベース間で表領域を移動できます。ドメイン索引データをエクスポートしてからインポートするかわりに、トランスポータブル表領域を使用して移動できます。
トランスポータブル表領域を使用したデータの移動は、エクスポートまたはインポートを実行する場合や、データのアンロードおよびロードを実行する場合よりも、はるかに高速です。その理由は、表領域のトランスポートが、データファイルをコピーして表領域の構造情報を統合するだけで実行できるからです。また、ロードやインポートを実行するときのように、後から索引を再作成する必要もありません。ODCIIndexInfo
のTransTblspc
フラグの有無を確認することで、ODCIIndexCreate()コールがドメイン索引のインポートの結果であるかどうかを判断できます。
ドメイン索引のセカンダリ表にトランスポータブル表領域を使用するには、実装タイプで2つのODCIインタフェースODCIIndexUtilGetTableNames()およびODCIIndexUtilCleanup()を追加提供する必要があります。
関連項目:
トランスポータブル表領域の使用方法は、『Oracle Database管理者ガイド』を参照してください。
8.4.6 ドメイン索引のビュー
次のビューでは、ユーザーがアクセス可能なドメイン索引に関連付けられているセカンダリ・オブジェクトに関する情報が提供されます。これらはドメイン索引にのみ関連しています。
表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 *_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文で参照(暗黙的に使用)されます。
そのため、これらのオブジェクトを作成したり将来のインポートに備えて定義をエクスポートする場合は、次の順序で行う必要があります。
-
ファンクション、パッケージおよびオブジェクト型
-
演算子
-
索引タイプ
8.5.2 オブジェクトの削除のセマンティクス
オブジェクトについての削除動作は、次のとおりです。
-
RESTRICT
セマンティクス: 依存オブジェクトが存在する場合、削除操作は禁止されます。 -
FORCE
セマンティクス: 依存オブジェクトが存在する場合でもオブジェクトは削除され、依存オブジェクトには再帰的に無効マークが付けられます。
表8-3に、演算子と索引タイプについてサポートされているデフォルトの削除オプションと明示的削除オプションを示します。その他のスキーマ・オブジェクトは、完全性とコンテキストのために含まれています。
表8-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 索引の状態の概要
状態 | 説明 |
---|---|
|
索引または索引パーティションがこの状態になるのは、 |
|
索引に対してDDL操作を実行する |
|
通常の索引と同じ。パーティションに対する特定のメンテナンス操作の結果として、パーティション表の索引が |
|
索引に |
|
索引に |
8.7.7 ローカル・ドメイン索引とDML操作
ローカル・ドメイン索引の索引パーティションがIN_PROGRESS
、FAILED
またはUNUSABLE
状態の場合、基礎となる表に対するDML操作は実行できません。ただし、索引がUNUSABLE
とマークされ、かつSKIP_UNUSABLE_INDEXES = true
である場合は、索引メンテナンスは実行されていません。
8.7.8 索引に影響する表操作
次の表に、索引の基礎となる表に対して実行できる操作と、索引への影響(ある場合)を示します。表8-5では、表操作がリストされていて、表8-6では、ALTER
TABLE
操作がリストされています。
表8-5 表操作の概要
表操作 | 説明 |
---|---|
|
表を削除します。すべての索引および対応するパーティションが削除されます。 |
|
表を切り捨てます。すべての索引と索引パーティションが切り捨てられます。 |
表8-6 パーティションのメンテナンスが関係するALTER TABLE操作の概要
ALTER TABLE操作 | 説明 |
---|---|
パーティションで使用できないローカル索引の変更 |
表パーティションに関連付けられているローカル索引パーティションに |
パーティションの再作成で使用できないローカル索引の変更 |
この表パーティションに関連付けられている |
パーティションの追加 |
新規の表パーティションを追加します。新規のローカル索引パーティションも追加されます。 |
パーティションの結合 |
ハッシュ・パーティション表にのみ適用されます。実表のパーティションを削除します。関連するローカル索引パーティションも削除されます。 |
パーティションの削除 |
実表のパーティションを削除します。関連するローカル索引パーティションも削除されます。 |
パーティションの切捨て |
表パーティションを切り捨てます。関連するローカル索引パーティションも切り捨てられます。 |
パーティションの移動 |
実表のパーティションを別の表領域に移動します。対応するローカル索引パーティションに |
パーティションの分割 |
表パーティションが2つのパーティションに分割されます。対応するローカル索引パーティションも分割されます。分割後のパーティションが空でない場合は、索引パーティションに |
パーティションのマージ |
2つの表パーティションをマージして1つのパーティションにします。対応するローカル索引パーティションもマージする必要があります。マージ後のパーティションにデータが含まれている場合は、索引パーティションに |
索引を除くパーティションの交換 |
表パーティションを非パーティション表と交換します。ローカル索引パーティションとグローバル索引には |
索引を含むパーティションの交換 |
表パーティションを非パーティション表と交換します。ローカル索引パーティションは、非パーティション表のグローバル索引と交換されます。索引パーティションは |
8.7.9 ドメイン索引のパーティション化に使用するODCIIndexインタフェース
ローカル・ドメイン索引をサポートするには、標準ODCIIndex
メソッドに加えて、ローカル・ドメイン索引固有の次の2つのメソッドを実装する必要があります。
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.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
ルーチンについて考えます。
- 追加または削除されるパーティションの情報を使用して、ODCIIndexUpdPartMetadata()メソッドが起動されます。1対2の分割には、1つのパーティションの削除と2つの新規パーティションの追加が必要です。
- 影響を受けるパーティションでODCIStatsUpdPartStatistics()が起動されます。
- すべてのシステム・パーティション索引および統計記憶表から分割されたパーティションが削除されます。
- システム・パーティション表に2つの新規のパーティションが追加されます。
- 分割されるパーティションが空の場合、最初のODCIIndexAlter()へのコールで分割パーティションが再作成され、2番目のODCIIndexAlter()へのコールで新しく追加されたパーティションが再作成されます。
8.8.5 索引を含む表交換パーティションの変更
ALTER TABLE EXCHANGE PARTITION
コマンドは、次の状況下でのみ、ドメイン索引を含む表に対して許可されます。
-
ドメイン索引が非パーティション表およびパーティション表の両方で定義される場合
-
非パーティション表およびパーティション表の両方に、同一の関連付けられている索引タイプがある場合
注意:
ALTER TABLE EXCHANGE PARTITION CASCADE
コマンドは、参照パーティション表にローカル・ドメイン索引がある場合は使用できません。
ALTER TABLE EXCHANGE PARTITION
ルーチンにより、次のユーザー実装メソッドが起動されます。
- 影響を受けるパーティションおよび索引に対するODCIIndexExchangePartition()
- 統計が収集される場合に影響を受けるパーティションおよび索引に対するODCIStatsExchangePartition()
8.9 システム管理ドメイン索引の使用
システム管理ドメイン索引が機能する仕組み、その統計の収集および保管方法、それらの使用に関する制限事項について考えます。
システム管理ドメイン索引の動作を検証します。
図8-1に、実表T1
の初期設定を示します。T1
には次の要素が含まれます。
-
3つのパーティション
-
IT1
(表の1つの列上のローカル・ドメイン索引) -
MT1
(メタデータ・オブジェクトに対応する表で、ローカル・ドメイン索引の各パーティションに固有の情報を格納するために索引タイプにより作成されたオプションのメタデータ表) -
SPT1
(索引データを格納するために索引タイプにより作成されたシステム・パーティション表)
表T1
、索引IT1
およびシステム・パーティション表SPT1
に示した構造には、1対1の関係で同数のパーティションがあります。メタデータ表MT1
には、これらの表内のパーティション数と同数の行があります。
図8-2に、例8-20の操作を実行して1つのパーティションを分割した後のT1および関連構造の状況を示します。
-
実表
T1
内のパーティションP2
をP21
およびP22
に分割します。 -
ローカル・ドメイン索引で、パーティション
IP2
が削除され、2つの新規パーティション、IP21
およびIP22
が作成されます。 -
索引タイプにより、メタデータ表
MT1
を必要に応じて更新するODCIIndexUpdPartMetadata()メソッドが起動されます。 -
システム・パーティション表
SPT1
で、パーティションIP2
に対応するパーティションは削除され、2つの新規パーティションが作成されます。 -
分割操作の結果、索引パーティションに
UNUSABLE
マークが付けられ、USABLE
になるように再作成されます。
図8-2 ALTER TABLE SPLIT PARTITIONの後の3つのパーティションの表
「図8-2 ALTER TABLE SPLIT PARTITIONの後の3つのパーティションの表」の説明
例8-20 既存の表パーティションの分割
ALTER TABLE T1 SPLIT PARTITION P2 INTO P21, P22
8.10 システム管理ドメイン索引の設計
非パーティション・ドメイン索引に影響するトップレベルのDDLがコールされると、ユーザー実装のODCIIndex
XXX
()
メソッドおよびODCIStats
XXX
()
メソッドが起動されます。表8-7に、これらのメソッドを示します。
ローカル・システム管理ドメイン索引に影響するトップレベルのDDLがコールされると、ユーザー実装のODCIIndex
XXX
()
メソッドとODCIStats
XXX
()
メソッドが起動されます。表8-8に、これらのメソッドを示します。要約すると、次のルールが適用されます。
-
ODCIIndex
XXX
()
DMLおよび問合せでは、索引パーティションのオブジェクト識別子(ODCIIndexInfo.IndexPartitionIden
)および実表パーティションの物理識別子(ODIIndexInfo.IndexCols(1).TablePartitionIden
)の両方が必要です。ODCIIndex
XXX
()
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 |
|
TRUNCATE TABLE |
( |
ALTER INDEX |
|
GATHER_INDEX_STATS() ( |
|
DELETE_INDEX_STATS() ( |
|
DROP INDEX (強制) |
|
INSERT |
|
DELETE |
|
UPDATE |
|
QUERY |
8.10.2 ローカル・システム管理ドメイン索引に対するメソッド
表8-8 ローカル・システム管理ドメイン索引に対するODCIXXX()メソッド
DDL | システム管理アプローチに使用されるODCIXXX()メソッド |
---|---|
CREATE INDEXTYPE |
システム管理アプローチを指定 |
CREATE INDEX |
ODCIIndexCreate()へのコール、 |
TRUNCATE TABLE |
|
ALTER INDEX |
|
GATHER_INDEX_STATS() ( |
ODCIStatsCollect()へのコール |
DELETE_INDEX_STATS() ( |
ODCIStatsDelete()へのコール |
DROP INDEX (強制) |
ODCIIndexDrop()、またはユーザー定義の統計が収集された場合はODCIStatsDelete() |
ALTER TABLE ADD PARTITION |
ODCIIndexUpdPartMetadata()、 |
|
統計が収集される場合はODCIStatsUpdPartStatistics() |
ALTER TABLE DROP PARTITION |
ODCIIndexUpdPartMetadata()、統計が収集される場合はODCIStatsUpdPartStatistics() |
ALTER TABLE TRUNCATE PARTITION |
ODCIIndexUpdPartMetadata()、 |
ALTER TABLE SPLIT PARTITION |
ODCIIndexUpdPartMetadata()、結果的にパーティションが空である場合は |
ALTER TABLE MERGE PARTITION |
ODCIIndexUpdPartMetadata()、結果的にパーティションが空である場合は |
ALTER TABLE EXCHANGE PARTITION |
ODCIIndexExchangePartition()、統計タイプが索引タイプに関連付けられていてユーザー定義の統計が収集された場合はODCIStatsExchangePartition() |
ALTER TABLE MOVE PARTITION |
パーティションの |
GATHER_TABLE_STATS() ( |
ODCIStatsCollect()へのコール |
DELETE_TABLE_STATS() ( |
統計タイプが索引タイプに関連付けられていてユーザー定義の統計が収集された場合は、ODCIStatsDelete()へのコール |
ALTER INDEX PARTITION |
|
INSERT |
|
DELETE |
|
UPDATE |
|
QUERY |
8.11 ローカル・ドメイン索引の作成
CREATE INDEX
ルーチンには次のステップが実装されています。
システム・パーティション索引記憶表にある各種グローバル索引の作成には、エラー・フラグが表示されることに注意してください。
8.14 システム管理ドメイン索引-サポートされているスキーム
システム管理ドメイン索引付けのアプローチは次のものをサポートします。
-
非パーティション化システム管理ドメイン索引。
-
レンジ・パーティション表、リスト・パーティション表、ハッシュ・パーティション表、時間隔パーティション表、自動リスト・パーティション表およびコンポジット・パーティション表のローカル索引。
-
参照パーティション表のルート表が、レンジ・パーティション化、リスト・パーティション化、ハッシュ・パーティション化、時間隔パーティション化、レンジ・コンポジット・パーティション化、リスト・コンポジット・パーティション化またはハッシュ・コンポジット・パーティション化されている場合の、参照パーティション表のローカル索引。
8.15 システム管理ドメイン索引付けの制限事項
-
システム管理ドメイン索引で索引付けできるのは1列のみです。
-
ローカル・ドメイン索引は、
REF
パーティション表またはIOT
に対して作成できません。 -
参照パーティション表のルート表が、時間隔コンポジット・パーティション化または時間隔サブパーティション化されている場合は、参照パーティション表上のローカル・ドメイン索引がサポートされません。
-
ローカル・ドメイン索引は、時間隔コンポジット、時間サブパーティション、自動リスト・コンポジットまたは自動リスト・サブパーティション表ではサポートされません。
-
ビットマップまたは一意のドメイン索引は指定できません。
8.16 非パーティション索引の移行
次のステップに従って、非パーティション・ユーザー管理ドメイン索引をシステム管理ドメイン索引に移行します。
- メタデータを変更します。
ALTER INDEXTYPE
コマンドを発行して、索引タイプのプロパティをシステムに登録します。これにより、統計タイプの関連付けが解除されます。 - 索引に
INVALID
マークが付けられます。ALTER INDEX ... COMPILE
コマンドを暗黙的に発行し、索引を再検証する必要があります。これにより、alter_option=AlterIndexMigrate
を含むODCIIndexAlter()メソッドがコールされます。 ASSOCIATE STATISTICS
コマンドを発行してシステム管理統計タイプをシステム管理索引タイプに関連付けます。