5 Oracle Text索引の管理
索引付けのエラーまたは失敗の管理、索引の再作成または再構築、カスタム索引プリファレンスの削除、同期および最適化タスクの管理、および索引メンテナンス操作の自動化の方法について学習します。
5.1 索引エラーの表示
索引付け操作は失敗したり、正常に完了しないことがあります。行の索引付け操作でエラーが発生すると、システムはそのエラーをOracle Textのビューに記録します。
索引のエラーは、CTX_USER_INDEX_ERRORS.
を使用して表示できますすべての索引のエラーを表示するには、CTXSYS
としてCTX_INDEX_ERRORS.
を使用します
たとえば、索引に最後に発生したエラーを表示するには、次の文を入力します。
SELECT err_timestamp, err_text FROM ctx_user_index_errors ORDER BY err_timestamp DESC;
エラーのビューをクリアするには、次のように入力します。
DELETE FROM ctx_user_index_errors;
このビューは、新しい索引を作成したときに、自動的にクリアされます。
関連項目:
索引エラー・ビューについてさらに学習するには、『Oracle Textリファレンス』を参照してください。
5.2 索引の削除
CREATE
INDEX
文を使用して索引を再作成する前に、既存の索引を削除する必要があります。
索引を削除するには、SQLのDROP
INDEX
文を使用します。
無効なPARAMETERS
文字列を使用して索引を作成する場合は、索引を再作成する前に削除する必要があります。
たとえば、newsindex
という索引を削除するには、次のSQL文を入力します。
DROP INDEX newsindex;
Oracle Textが索引の状態を判断できない場合(索引付け操作が異常終了したときなど)は、索引を削除できません。この場合は、次のコマンドを使用します。
DROP INDEX newsindex FORCE;
関連項目:
DROP
INDEX
文についてさらに学習するには、『Oracle Textリファレンス』を参照してください。
5.3 失敗した索引の再開
ALTER
INDEX
文を使用すると、失敗した索引作成を再開できる場合があります。通常は、失敗した索引を調査して修正した後、その索引作成を再開します。すべての索引の失敗を再開できるわけではありません。
索引の最適化は定期的にコミットされます。したがって、最適化操作が失敗しても、コミット・ポイントまでのすべての最適化作業は保存されています。
次の文は、10MBのメモリーでnewsindex
の索引付け操作を再開します。
ALTER INDEX newsindex REBUILD PARAMETERS('resume memory 10M');
5.4 索引の再作成
5.4.1 グローバル索引の再作成
Oracle Textでは、RECREATE_INDEX_ONLINE
が用意されていて新規プリファレンスによりCONTEXT
索引を再作成できる一方、元表での挿入、更新および削除機能が保持されています。RECREATE_INDEX_ONLINE
を単一ステップのプロシージャで使用して、グローバル索引用のCONTEXT
索引をオンラインで作成できます。既存の索引を残したまま新規索引が作成されるため、この操作には既存の索引とほぼ同じサイズの記憶域が必要です。また、RECREATE_INDEX_ONLINE
操作はオンラインで実行されるため、操作中に元表で挿入、更新および削除を実行できます。再作成プロセス中に発生したすべての挿入、更新および削除操作は、オンライン保留中キューに記録されます。
-
再作成操作の完了後、新しい情報がすぐには反映されない場合があります。オンラインでの索引の作成の場合と同様に、再作成操作の完了後に索引を同期化して完全に最新にする必要があります。
-
再作成操作中に索引に対して発行される同期化は、既存のデータに対して処理されます。問合せがエラーを戻す場合、同期化はブロックされます。
-
再作成操作の過程で索引に対して発行された最適化コマンドは、なにも実行されずにエラーなしで即時に戻ります。
-
RECREATE_INDEX_ONLINE
の間は、ほぼ通常どおりに索引を問い合せることができます。問合せは、最後のスワップが終わるまで、既存の索引およびポリシーに基づいて結果を戻します。また、挿入、更新および削除操作を発行してそれを同期化した場合は、既存の索引を問い合せると新しい行を表示できます。
ノート:
RECREATE_INDEX_ONLINE
では、トランザクション・ベースの問合せはサポートされていません。
時間制限付き同期化によるグローバル索引の再作成
索引の再作成を制御して、営業時間外にSYNC_INDEX
の時間制限を設定し、索引を追加的に再作成できます。CREATE_SHADOW_INDEX
プロシージャをPOPULATE_PENDING
およびmaxtimeとともに使用します。
5.4.2 ローカル・パーティション索引の再作成
索引がローカルにパーティション化されている場合は、1回のステップで索引を再作成できません。最初にシャドウ・ポリシーを作成してから、すべてのパーティションに対してRECREATE_INDEX_ONLINE
プロシージャを実行する必要があります。パーティションの索引の再作成で索引パーティション・データおよび索引パーティション・メタデータをスワップするかどうかを示すSWAP
またはNOSWAP
を指定できます。
パラメータ文字列でNOPOPULATE
を指定した場合、このプロシージャを使用して、各パーティションのメタデータ(記憶域プリファレンスなど)を更新できます。このキーワードは、時間が限定された同期化によってシャドウ索引を追加的に構築する場合に便利です。NOPOPULATE
を指定した場合、NOSWAP
が暗黙的に強制されます。
-
すべてのパーティションで
NOSWAP
が使用されている場合、既存の索引とほぼ同じサイズの記憶域が必要です。索引パーティションの再作成中にスワッピングは実行されないため、パーティションに対する問合せは通常処理されます。複数のパーティションにわたる問合せは、スワッピングの段階に到達するまで、パーティションをまたがって一貫した結果を戻します。 -
SWAP
を指定してパーティションを再構築する場合、その操作に必要な記憶域は、既存の索引パーティションとほぼ同じサイズです。索引パーティション・データおよび索引パーティション・メタデータは再作成後にスワッピングされるため、複数のパーティションにわたる問合せはパーティション間で一貫した結果を戻しませんが、各索引パーティションに関しては常に正しい結果となります。 -
SWAP
を指定した場合、パーティションに対する挿入、更新および削除操作ならびに同期化は、スワッピング・プロセス中にブロックされます。
同時スワッピングによるローカル索引の再作成
ローカル・パーティション索引をオンラインで再作成して、プリファレンスを作成または変更できます。索引およびパーティションのメタデータのスワッピングは、この処理の最後に実行されます。複数のパーティションにわたる問合せは、最後にEXCHANGE_SHADOW_INDEX
が実行されているときを除く再作成の処理中、パーティションをまたがって一貫した結果を戻します。
同時スワッピングによるローカル索引再作成のスケジューリング
CTX.DDL
パッケージのRECREATE_INDEX_ONLINE
により、ローカル・パーティション索引を追加的に再作成できます。ここで、パーティションは最後にすべてスワッピングされます。
パーティションごとのスワッピングによるローカル索引の再作成
同時にすべてのパーティションをスワッピングするかわりに、新しいプリファレンスを使用して索引をオンラインで再作成でき、各パーティションはその完了時にスワッピングされます。すべてのパーティションにわたる問合せは、その処理中に一貫性のない結果を戻す場合があります。このプロシージャでは、CREATE_SHADOW_INDEX
がRECREATE_INDEX_ONLINE.
とともに使用されます
5.5 索引の再構築
ALTER
INDEX
を使用すると、有効な索引を再構築できます。索引の再構築では、索引のほとんどの設定は変更できません。新しいプリファレンスを使用して索引付けする場合に、索引を再構築することがあります。一般的に、索引を削除して、CREATE
INDEX
文を使用して再作成した後に、索引を再構築するメリットはありません。
関連項目:
索引の設定の変更の詳細は、「「索引の再作成」を参照してください
次の文は、索引を再構築し、レクサー・プリファレンスをmy_lexer
で置き換えます。
ALTER INDEX newsindex REBUILD PARAMETERS('replace lexer my_lexer');
5.7 CONTEXT索引に関するDML操作の管理
DML操作とは、元表に対するドキュメントの挿入、更新または削除操作のことです。
この項では、DML操作のためにOracle TextのCONTEXT
索引を表示、同期化および最適化する方法を説明します。この項では、次の項目について説明します。
5.7.1 保留中のDML操作の表示
元表のドキュメントを挿入、更新または削除すると、そのROWIDは、その索引が同期化されるまでDMLキューに保持されます。このキューはCTX_USER_PENDING
ビューで表示できます。
たとえば、索引で保留中のDML操作を表示するには、次の文を入力します。
SELECT pnd_index_name, pnd_rowid, to_char( pnd_timestamp, 'dd-mon-yyyy hh24:mi:ss' ) timestamp FROM ctx_user_pending;
この文によって、次の形式の出力結果が戻されます。
PND_INDEX_NAME PND_ROWID TIMESTAMP ------------------------------ ------------------ -------------------- MYINDEX AAADXnAABAAAS3SAAC 06-oct-1999 15:56:50
関連項目:
CTX_USER_PENDING
ビューについてさらに学習するには、『Oracle Textリファレンス』を参照してください
5.7.2 索引の同期化
索引を同期化すると、元表に対する保留中のすべての更新および挿入が処理されます。同期化は、PL/SQLでCTX_DDL.SYNC_INDEX
プロシージャを使用して実行します。CTX_DDL.SYNC_INDEX
プロシージャを使用して索引の同期化の期間およびロック動作を制御できます。
SYNC_INDEXによる索引の同期化
次の例では、2MBのメモリーを使用して索引を同期化します。
begin
ctx_ddl.sync_index('myindex', '2M');
end;
SYNC_INDEXのmaxtimeパラメータ
SYNC_INDEX
プロシージャには、OPTIMIZE_INDEX
のように、操作に対し分単位の提示された時間制限を指定するmaxtime
パラメータが含まれます。SYNC_INDEX
プロシージャは、指定の時間制限内に、キュー内のできるかぎり多くのドキュメントを処理します。
SYNC_INDEXのロック・パラメータ
SYNC_INDEX
のロック・パラメータにより、索引に対してすでに他の同期化が実行中の場合に同期化がどのような動作をするかを構成できます。
-
SYNC_INDEX
が索引名なしに起動された場合、ロック・パラメータは無視されます。 -
ロック・パラメータは、自動同期化(
sync
on
commit
やsync
every
など)には反映されません。 -
ロック・モードが
LOCK_WAIT
の場合、ロックが取得できない場合には永久に待機し、maxtimeの設定は無視されます。
使用できるオプションは次のとおりです。
オプション | 説明 |
---|---|
|
別の |
|
別の |
|
別の |
ノート:
Oracle Database 12cリリース2 (12.2.0.1)以降、SYNC_INDEX
を使用すると、STAGE_ITAB
の行が$I
表に自動的にマージされて戻されます。この行のマージは、STAGE_ITAB ($G)
の行数がSTAGE_ITAB_MAX_ROWS
パラメータ(デフォルトでは1万行)を超えた場合に実行されます。したがって、マージの最適化を明示的に実行したり、自動最適化ジョブをスケジュールする必要はありません。
5.7.3 索引の最適化
CONTEXT
CONTEXT索引は、各ワードにそのワードを含むドキュメントのリストが格納された逆向きの索引です。たとえば、初期の索引付け操作が1つ終了すると、ワードDOGのエントリは次のようになります。
DOG DOC1 DOC3 DOC5
索引の同期化を頻繁に行うと、最終的にCONTEXT
索引が断片化します。索引の断片化は、問合せ応答時間に悪影響を与える場合があります。したがって、断片化および索引のサイズを減らし、最善の問合せパフォーマンスを実現するために、時間をおいてCONTEXT
索引を最適化します。
自動最適化ジョブをスケジュールするには、STAGE_ITAB_MAX_ROWS
を0
に設定して、SYNC_INDEX
を使用して実行される自動マージを無効にする必要があります。
索引を最適化する場合は、CTX_DDL.OPTIMIZE_INDEX.
を使用することをお薦めします索引の最適化を理解するには、索引の構造と同期化の内容を理解する必要があります。この項では、次の項目について説明します。
5.7.3.1 索引の断片化
新しいドキュメントが元表に追加されると、索引は新しい行の追加によって同期化されます。たとえば、ワードdogを含むDOC 7ドキュメントを追加し、索引を同期化すると、次のようになります。
DOG DOC1 DOC3 DOC5 DOG DOC7
その後の挿入や更新、削除によっても次のように新しい行が作成されます。
DOG DOC1 DOC3 DOC5 DOG DOC7 DOG DOC9 DOG DOC11
索引の断片化は、新規文書を追加して索引を同期化するときに発生します。特に、バックグラウンドでの挿入、更新または削除では索引が頻繁に同期化されるため、一般的にはバッチ・モードでの同期化に比べて断片化が激しくなります。
バッチ処理をより低い頻度で実行する場合、索引の行数が減少してドキュメント・リストが長くなるため、断片化が軽減されます。
CTX_DDL.OPTIMIZE_INDEX.
を使用して、FULL
(完全)またはFAST
(高速)モードで索引を最適化すると、索引の断片化を減少させることができます
5.7.3.2 ドキュメントの無効性とガベージ・コレクション
ドキュメントを元表から削除すると、Oracle Textでは、そのドキュメントに削除済のマークが設定されます。ただし、索引は即時に変更されません。
古い情報が領域を占有していると問合せ時に余分なオーバーヘッドが発生するため、索引をFULL
モードで最適化して古い情報を削除する必要があります。この処理はガベージ・コレクションと呼ばれます。元表に対する更新または削除を頻繁に実行する場合は、ガベージ・コレクションのためにFULL
モードで最適化を行う必要があります。
5.7.3.3 単一のトークンの最適化
索引全体の最適化以外に、単一のトークンも最適化できます。トークン・モードを使用すると、参照頻度の低いトークンの最適化に時間をかけずに、検索頻度の高い索引トークンを最適化できます。
たとえば、トークンDOGの更新と問合せが頻繁に行われる場合、索引内のこのトークンのみの最適化を指定できます。
トークンを最適化すると、そのトークンの問合せ応答時間が短縮できます。
索引の最適化を単一のトークンで行うには、CTX_DDL.OPTIMIZE_INDEX.
を使用します
5.7.3.4 索引の断片化およびガベージ・データの表示
CTX_REPORT.INDEX_STATS
プロシージャを使用すると、索引の統計レポートを作成できます。このレポートには、最適な行の断片化に関する情報、最も断片化されているトークン、および索引内のガベージ・データの量が含まれています。大規模な索引の場合はこのレポートの実行に時間がかかることがありますが、このレポートは索引を最適化する必要があるかどうかの判断に役立ちます。
関連項目:
CTX_REPORT.INDEX_STATS
プロシージャについてさらに学習するには、『Oracle Textリファレンス』を参照してください
5.8 索引に対する自動メンテナンスの使用
索引の同期タスクを手動で管理するかわりに、自動メンテナンスを使用してCTX_DDL.SYNC_INDEX
操作を自動化できます。
5.8.1 自動メンテナンスについて
索引メンテナンスとは、DML操作の実行の結果として索引データ構造(インメモリーおよびディスク)を更新するプロセスです。
概要
自動メンテナンスを使用した索引は、ユーザーによる操作なしでバックグラウンドで同期されます。
自動メンテナンスは、Oracle Database 23c以降のリリースで作成されたOracle Text CONTEXT
索引および検索索引(Oracle Text、JSONおよびXML検索索引)を同期するためのデフォルトの方法です。
自動メンテナンスと同期(SYNC
)のどちらの方法でも、元表に対する保留中の更新、挿入および削除の処理を伴います。ただし、自動メンテナンスとSYNC
の仕様は直交的です。自動メンテナンスでは、非同期メンテナンス・フレームワークを使用してバックグラウンドでSYNC
操作が実行され、次の機能が提供されます:
-
時間ベースまたは手動のSYNC操作がなくなる:
自動メンテナンス・モードでは、IRnnバックグラウンド・プロセスにより、最適な方法で自動的に索引メンテナンス操作が実行されます。この機能では、最適な同期間隔が内部的に決定され(DML到着に基づく)、必要に応じてバックグラウンドの
SYNC
操作が自動的にスケジュールされます。自動決定された間隔はオーバーライドできません。このバックグラウンド・メカニズム・プロセスの詳細は、「非同期メンテナンス・フレームワーク」を参照してください。
-
バックグラウンド・ジョブの頻度を削減:
データベース・スケジューラではなく、バックグラウンド・プロセスによって索引がメンテナンスされます。このバックグラウンド・メカニズムでは、各
CTX_DDL.SYNC_INDEX
操作が別々のイベント(同期ステージ)に分割され、必要な場合のみ各イベントが開始されます。 -
デフォルトのメンテナンス構成を提供します:
これらの索引には、
SYNC
タイプの構成や同期間隔の設定は必要はありません。デフォルトでは、索引は自動メンテナンスとSYNC (MANUAL)
の組合せで構成されます。これらの索引と互換性がある他のSYNC
設定はありません。このモードでは
SYNC (MANUAL)
の動作が異なることに注意してください。通常のSYNC (MANUAL)
タイプ(索引を手動で同期する必要がある)とは異なり、ここではCTX_DDL.SYNC_INDEX
がバックグラウンドで自動的にコールされます。
自動メンテナンスを使用する理由とタイミング
索引の同期要件が明確でない場合や、多数の索引を最適な方法で同期させる必要がある場合は、自動メンテナンスを使用することをお薦めします。
このフレームワークを使用する利点は、索引の管理タスクが減ることに加え、DMLキューの追跡によって、バックグラウンドのSYNC
操作を実行する必要があるタイミングが自動的に判別されることです。また、プラガブル・データベース(PDB)ごとに索引または索引パーティションごとに独立したジョブを作成するのではなく、任意の時点で実行される様々なバックグラウンド・ジョブの頻度をより詳細に制御できます。結果として、自動メンテナンスは、データベース・リソースでのワークロードを減らし、スケジューリングの競合をなくし、問合せのパフォーマンスを高めるために役立ちます。
自動バックグラウンド同期も有効にするSYNC (EVERY)
では、interval-string
を使用して同期間隔を手動で指定する必要があります。SYNC (EVERY)
を使用すると同期間隔を明示的に制御できますが、自動メンテナンスを使用するとデータベース・リソースを効率的に使用できます(特に複数のPDBをサポートしている場合)。また、SYNC (EVERY)
では、ユーザーが推定した新規索引データ到着頻度に基づいて、バックグラウンド同期ジョブが過剰に起動される可能性があります。
手動メンテナンスとは
手動メンテナンスは、リリース23cより前の同期動作を提供する非自動メンテナンス・モードです。
手動メンテナンス・モードでは、SYNC MANUAL
、SYNC EVERY interval-string
、SYNC ON COMMIT
などのSYNC
タイプを指定できます。MAINTENANCE MANUAL
索引パラメータは、索引を手動メンテナンスに設定します。
新しいリリースにアップグレードした後も、既存の索引では、以前に指定した同期方法が引き続き使用されます。たとえば、Oracle Database 23cにアップグレードした後に、既存の索引が、以前に指定したSYNC
設定を使用して手動メンテナンスに設定されます。アップグレード前にSYNC
設定を指定しなかった場合、索引では、デフォルトのSYNC
タイプが使用されます。つまり、Oracle TextのCONTEXT
索引の場合はSYNC MANUAL
、JSONおよびXML検索索引の場合はSYNC ON COMMIT
です。必要な場合は、このような索引に対して自動メンテナンスを手動で有効にできます。
MAINTENANCEパラメータの構成方法
MAINTENANCE
パラメータにより、索引のメンテナンス・タイプ(モード)を制御します。MAINTENANCE
パラメータは、パーティションごとではなくグローバルに設定できます。つまり、索引に対して指定したメンテナンス・タイプは、すべての索引パーティションに適用されます。
-
MAINTENANCE AUTO
(デフォルト): 索引を自動メンテナンスに設定します。デフォルトでは、索引の作成時に自動メンテナンスを構成する必要はありません。この例では、デフォルトの動作(PARAMETERS
句なし)を持つJSON検索索引を作成します。CREATE SEARCH INDEX po_search_idx ON j_purchaseorder (po_document) FOR JSON;
この例では、PARAMETERS
句を使用してMAINTENANCE AUTO
を明示的に指定することで、JSON検索索引を作成します:CREATE SEARCH INDEX po_search_idx ON j_purchaseorder (po_document) FOR JSON PARAMETERS ('MAINTENANCE AUTO');
-
MAINTENANCE MANUAL
: 索引を手動メンテナンスに設定します。この例では、PARAMETERS
句を使用してMAINTENANCE MANUAL
を指定することで、新しいJSON検索索引の自動メンテナンスを無効にします:CREATE SEARCH INDEX po_search_idx ON j_purchaseorder (po_document) FOR JSON PARAMETERS('MAINTENANCE MANUAL');
これらのパラメータの構成の詳細は、「自動メンテナンスの有効化および無効化」を参照してください。
ALTER INDEX
を使用して、自動メンテナンス・モードと手動メンテナンス・モードとを切り替えることができます。このコマンドでは同期オプションのみが変更されるため、索引を再構築する必要はありません。手動メンテナンスに設定されている場合、SYNC
タイプを明示的に指定しないと、索引ではデフォルトのSYNC
タイプが使用されます。
要件と制限事項
-
非同期メンテナンス・フレームワークのデータベース互換性は、Oracle Database 21.0.0.0以降です。
-
自動メンテナンスと次のパラメータの組合せはサポートされていません:
-
FAST_QUERY
-
ASYNCHRONOUS_UPDATE
-
TRANSACTIONAL
-
SYNC (ON COMMIT)
およびSYNC (EVERY)
前述のいずれかの組合せを実行するとエラーが発生し、索引と互換性のあるモードを使用するよう求められます。
-
-
MAINTENANCE AUTO
索引では、シャドウ索引はサポートされていません。
5.8.2 非同期メンテナンス・フレームワーク
自動メンテナンス・モードでは、IRnnバックグラウンド・プロセスによって索引メンテナンス操作が実行されます。これにより、バックグラウンド・ジョブのスケーラビリティと、問合せのパフォーマンスが向上します。
メンテナンス・イベントのリスト
各SYNC
操作は、バックグラウンドで同時に実行できる別々のイベント(ステージ)からなります。
イベント | 説明 |
---|---|
(Sync-M) |
$Bカタログ表を読み取って次のDocIDを見つけ、DocIDを各ROWIDに割り当てます。次に、$Cコミット・ジャーナルの内容を読み取り、それをROWIDでソートし、削除または追加する必要があるDocIDを決定します。次に、$Kマッピング表に対して削除と挿入を実行します。その後、削除したDocIDを$Nガベージ・コレクション表に追加します。最後に、$Cから読み取ったすべての行を削除します。 障害の発生中は、これらのイベントが再試行され、他のOracle Real Application Clusters (Oracle RAC)ノードにもブロードキャストされます。 |
(Sync-MT) |
コミット時に生成される、Sync-Mタイムアウト・イベントを指定します。これらはタイムアウト・アクションによってのみ処理され、割り込みアクションでは処理されません。 タイムアウト中に、Sync-MTイベントがSync-Mイベントに変換されます。 |
(Sync-R) |
ポスト・ステージの 障害の発生中は、これらのイベントが再試行され、他のRACノードにもブロードキャストされます。 |
(Sync-S) |
Sync-Rによって生成された |
(Sync-P) |
新しい索引データを含むポスト・リストを生成します。Sync-Pは、 Oracle RACシステムで、同時イベントが、 障害の発生中は、Sync-Sイベントがスケジュールされて反復が増分されます。Oracle RACシステムで、失敗したSync-PCおよび |
(Sync-PS) |
Sync-Pをシリアルに実行します。ポストはSGAバッチで生成されます。 |
(Sync-PC) |
Sync-Pを同時に実行します。競合なしで複数の範囲を同時に独立して実行するようにスケジュールできます。 |
(Sync-W) |
ポスト・リストのSGAバッチをディスクに書き込みます。Sync-Wイベントは、それ自体と同時に実行できます。ただし、これらのイベントは、 Sync-Wイベントは、それらを生成したノードにローカルなSGAバッチを処理するため、他のRACノードにブロードキャストされることはありません。 |
(Sync-C) |
障害のためにSGAバッチが関連付けられていない$B内の |
(Sync-I) |
索引および索引パーティションを調べて($C表と$B表をチェックする)、イベントが欠落しているかどうかを確認します。 障害の発生中は、Sync-Iイベントは再試行されず、他のRACノードにブロードキャストされることもありません。 |
|
各索引または索引パーティションのSync-Iイベント、および各プラガブル・データベース(PDB)のECleanイベントをスケジュールします。スケジューラが実際のモニター・イベントをスケジュールし、それをさらにモニター・ワーカーが処理します。 |
(EStat) |
ライター・ワーカー(Sync-Wイベント)によって処理される終了イベント。PDB内の完了したすべてのイベントについてイベント統計を書き込みます。 |
(EClean) |
永続イベント統計(PDB固有のしきい値より古いもの)をディクショナリからクリーン・アップします。 |
(Opti-ST) |
Sync-Wイベントの順序完了後に発生する大きなポスト・リストのギャップに対処しないようにします。 |
(Opti-S) |
Sync-Wイベントによる Opti-Sイベントは、Sync-Wイベントで$Bに格納された$Gトークンの数を集計し、その集計数がユーザー指定のしきい値に達するとOpti-Mイベントをスケジュールします。 |
(Opti-M) |
実際の |
バックグラウンド・メカニズム・プロセス
メインのスケジューラ・バックグラウンド・プロセスでは、すべての索引によるワークロードが、事前定義された間隔(デフォルトでは3秒ごと)でチェックされます。その後、そのワークロードがワーカー・バックグラウンド・プロセスに割り当られます。それにより、イベントが1つずつ読み取られ、イベント・タイプに基づいて処理されます。索引は、ワーカー・プロセスでCTX_DDL.SYNC_INDEX
が実行された直後に同期されます。スケジューラ・プロセスとワーカー・プロセスは別として、モニター・バックグラウンド・プロセスは、失われたイベントのリカバリに役立ちます。
CTX_DDL.SYNC_INDEX
コールでは、次のステップが順番に実行されます:
-
索引または索引パーティションのすべての待機イベントをリセットします:
イベントが失敗すると、そのイベントを待機キューに追加し、遅延時間を徐々に増分していきます。問題を修正しても、そのイベントは、現在の遅延時間が経過するまで待機し続けます。このような遅延時間を追跡するために、増分レベルで再試行イベントをスケジュールします。つまり、スケジューラ・プロセスが最初に再試行イベントをイベント・キューに移動します。スケジューラがそれをイベント・キューから待機キューに移動し、次に準備完了キューに移動し、最後にワーカー・プロセスに割り当てます。
各イベントには、増分レベルに加え、再試行の反復があります。長期にわたる再試行では(つまり、再試行イベントがその元のイベントと同じでない場合)、レベルではなく反復を増分し、レベルを反復に初期化します。
CTX_DDL.SYNC_INDEX
では、イベントをただちに強制的に再実行できます。それにより、関連するすべての待機キュー・イベントがイベント・キューに移動され、レベルと反復もリセットされます。イベントが再度失敗した場合は、初めの増分レベルまたは反復から再開します。 -
フォアグラウンドでSync-Mを実行します:
CTX_DDL.SYNC_INDEX
は、バックグラウンド・メンテナンスが終了するまで待機します。ただし、すべてのイベントが終了するまで待機するのではなく、フォアグラウンドでSync-Mをコールし、割り当てられている最大DocIDを取得します。このDocIDを使用して、将来のすべてのイベントを無視します。 -
SYNC
の他のステージをバックグラウンドでスケジュールします。CTX_DDL.SYNC_INDEX
は、スケジューラ・プロセスをポストして、保留中のイベントの処理をただちに開始できるようにします。 -
バックグラウンド処理の完了まで待機します:
この待機は、
locking
パラメータがCTX_DDL.LOCK_WAIT
に設定されている場合はそれによって制御されます。他のすべての値については、CTX_DDL.SYNC_INDEX
が、Sync-Mの完了後に返します。memory
、parallel_degree
、maxtime
およびdirect_path
パラメータの値は無視されます。一部のバックグラウンド・イベントが遅延しているか完了できない場合、
CTX_DDL.SYNC_INDEX
はORA-30608を返し、カタログ・ビューにエラー・メッセージを記録します。
自動メンテナンスと手動メンテナンスのSYNC動作の違い
自動メンテナンスと手動メンテナンスの同期動作の違い、およびCTX_DDL.SYNC_INDEX
操作の間に様々なイベントがどのように処理されるかを比較します:
動作 | 自動メンテナンス | 手動メンテナンス |
---|---|---|
バックグラウンド・メカニズム |
自動メンテナンス・モードでは、バックグラウンド・プロセスによって索引がメンテナンスされます。このバックグラウンド・メカニズムでは、各 たとえば、Sync-SによってSync-Pが起動されて、Sync-Rで |
手動メンテナンス・モードでは、DBMS_SCHEDULER バックグラウンド・ジョブによって索引がメンテナンスされます。このバックグラウンド・メカニズムでは、すべての同期イベント(Sync-M、Sync-RおよびSync-P)が単一のSYNC 操作としてまとめて実装されます。
|
|
これらの索引は、自動メンテナンスと 通常の その他の |
|
カタログ・ビュー |
|
|
関連項目
5.8.3 自動メンテナンスの有効化および無効化
CONTEXT
および検索索引に対してデフォルトで有効になっています。索引の作成時に自動メンテナンスを明示的に指定する方法、またはデフォルトの動作をオーバーライドしてかわりにSYNC
を有効にするために無効にする方法について学習します。5.8.4 自動メンテナンスと手動メンテナンスの切替え
ALTER INDEX
を使用すると、索引を再構築せずにMAINTENANCE AUTO
とMAINTENANCE MANUAL
を切り替えることができます。モードの変更中に、互換性のあるメンテナンス・タイプとSYNC
タイプの組合せを指定する必要があります。
モード間の切り替えのガイドライン
-
MAINTENANCE AUTO
は、SYNC (MANUAL)
でサポートされています。デフォルトでは、自動メンテナンスを含むすべての索引がこの組合せで指定されます。 -
MAINTENANCE AUTO
とSYNC ON COMMIT
またはSYNC (EVERY)
の組合せはサポートされていません。SYNC (ON COMMIT)
またはSYNC (EVERY)
も使用する索引にMAINTENANCE AUTO
を指定する場合は、最初にそのような索引をSYNC (MANUAL)
に設定する必要があります。 -
静的ディクショナリ・ビュー
CTX_USER_INDEXES
には、現行ユーザーの既存のOracle TextCONTEXT
索引および検索索引に関する情報が含まれています。たとえば、この問合せでは、MAINTENANCE AUTO
に設定されたOracle Text索引のSYNC
タイプとメンテナンス・タイプがリストされます。SQL> SELECT IDX_NAME, IDX_SYNC_TYPE, IDX_MAINTENANCE_TYPE FROM CTX_USER_INDEXES; IDX_NAME IDX_SYNC_TYPE IDX_MAINTENANCE_TYPE ----------------------- ---------------------------- ---------------------- DOCIDX MANUAL AUTO
索引の自動メンテナンスへの切替え
この表では、索引をMAINTENANCE MANUAL
からMAINTENANCE AUTO
に変更する、様々なSYNC
タイプでのALTER INDEX
の例を示します。
設定 | メンテナンスおよびSYNCタイプ | 例 |
---|---|---|
変更後
|
|
|
変更後
|
|
|
変更後
|
|
|
索引の手動メンテナンスへの切替え
この表では、索引をMAINTENANCE AUTO
からMAINTENANCE MANUAL
に変更する、様々なSYNC
タイプでのALTER INDEX
の例を示します。
設定 | メンテナンスおよびSYNCタイプ | 例 |
---|---|---|
変更後
|
|
CONTEXT 索引のデフォルトのSYNC タイプはMANUAL です。
|
変更後
|
|
|
変更後
|
|
|
関連項目
5.8.5 メンテナンス・イベントおよびエラーの監視
SYS
ユーザーとCTXSYS
ユーザーは、カタログ・ビューを問い合せて、自動メンテナンスを使用した索引に関するすべてのバックグラウンド・メンテナンス・イベントのステータスを監視できます。
CTX
ビューと動的パフォーマンス・ビューを定期的に調べて、完了したか遅延しているすべてのバックグラウンド・メンテナンス・イベントのステータスを把握することをお薦めします。
メンテナンス・イベントに関するデータおよびステータスの問合せ
-
CTX_BACKGROUND_EVENTS
:このOracle Textビューには、
SYS
ユーザーまたはCTXSYS
ユーザーのイベントの実行について履歴情報が表示されます。 -
CTX_USER_BACKGROUND_EVENTS
:このOracle Textビューには、索引所有者に基づいて、現行ユーザーのイベントの実行について履歴情報が表示されます。
-
V$TEXT_WAITING_EVENTS
:この動的パフォーマンス・ビューには、エラーや競合が原因で遅延しているか完了できないイベントについて履歴情報が表示されます。
たとえば、索引オブジェクトの番号と名前、索引所有者の番号と名前、元表(または表パーティション)のオブジェクトの番号と名前、イベントのタイプ(SYNC-Postings
、SYNC-Mapping
、SYNC-Ranges
など)、イベントのステータス(成功、実行中、失敗など)、再試行の反復のステータス(再試行の遅延、待機時間など)、イベントが待機を始めてからの経過時間、ログに記録されたエラー・メッセージなどを問い合せることができます。
エラーの処理
-
一部のエラーは一時的なものであり、再試行したときには再現されません。このようなエラー・タイプの場合は、ユーザーによる操作は必要ありません。
-
失敗したイベントの中には、再試行後に自動的に成功するものがあります。再試行イベントが成功しない場合は、別のイベントからそのイベントを再起動してみてください。
たとえば、再試行後に
SYNC-Postings
(Sync-P)が失敗した場合は、システムでシリアル操作または同時操作をスケジュールできるように、SYNC-Scheduler
(Sync-S)を再起動できます。Sync-Sが正常に完了すると、Sync-Pのキューがクリアされ、Sync-Pがただちに開始レベルで実行され、システムが過負荷になることはありません。 -
定期的に再試行してもイベントが成功しない場合は、データベース管理者に連絡してください。
-
定期的な再試行によるシステムの負荷を制限するために、連続的な再試行間の遅延時間が徐々に増分される場合があります。
このような遅延時間を追跡するために、すべての再試行イベントが増分レベルでスケジュールされます。つまり、スケジューラ・プロセスが最初に再試行イベントをイベント・キューに移動します。スケジューラ・プロセスがそれをイベント・キューから待機キューに移動し、次に準備完了キューに移動し、最後にワーカー・プロセスに割り当てます。
各イベントには、増分レベルに加え、再試行の反復があります。長期にわたる再試行では(つまり、再試行イベントがその元のイベントと同じでない場合)、レベルではなく反復が増分され、レベルが反復に初期化されます。
-
Oracle Real Application Clusters (Oracle RAC)システムでは、一部のノードでのみエラーが発生し、他のノードでは発生しない場合があります。このような場合にイベントが正常に完了するのは、そのイベントが他のノードに送信された場合のみです。