このドキュメントでは、OceanBaseのベクトルインデックスを監視およびメンテナンスする方法について説明します。
監視
システムビューを使用すると、ベクトルインデックスの基本情報とリアルタイム状態を確認できます。
- [G]V$OB_HNSW_INDEX_INFO ビューを使用して、HNSW シリーズインデックスの基本情報とリアルタイム状態を確認できます。
- [G]V$OB_IVF_INDEX_INFO ビューを使用して、IVF シリーズインデックスの基本情報とリアルタイム状態を確認できます。
メンテナンス
増分データが過剰な場合、検索性能が低下します。増分データテーブルのデータ量を削減するため、OceanBaseデータベースはベクトルインデックスのメンテナンスに DBMS_VECTOR を導入しています。
フルリフレッシュ(再構築)
手動によるテーブル全体の再構築
インデックス作成後に更新または削除されるデータが多い場合、REBUILD_INDEX プロシージャを使用したフルリフレッシュを実行することを推奨します。説明と例については、REBUILD_INDEX を参照してください。
フルリフレッシュは24時間ごとにチェックされ、新規データが既存データの20%を超えた場合に自動的に実行されます。フルリフレッシュはバックグラウンドで非同期に実行され、まず新しいインデックスが作成され、その後古いインデックスが置き換えられます。再構築中も古いインデックスは利用可能な状態が維持されますが、全体的にプロセスは比較的遅くなります。
また、vector_index_memory_saving_mode 構成パラメータを提供しており、インデックス再構築時のメモリ使用量を制御できます。このモードを有効にすると、パーティションテーブルのベクトルインデックス再構築(rebuild)プロセス中のメモリ消費を削減できます。通常、ベクトルインデックスの再構築にはインデックスサイズの2倍のメモリが必要です。メモリ節約モードを有効にすると、システムはパーティションテーブルの各パーティションの構築が完了するごとに、そのパーティションのメモリインデックスを一時的に削除することでメモリを解放し、再構築操作に必要な総メモリを効果的に削減します。構文と例については、vector_index_memory_saving_mode を参照してください。
注意点は以下の通りです:
オフラインDDL 操作(例:
ALTER TABLEによるテーブル構造や主キーの変更)を実行すると、インデックステーブルの再構築が発生します。インデックスの再構築では並列度を指定できないため、システムはデフォルトで単一スレッドを使用します。そのため、データ量が多い場合、再構築プロセスが遅くなり、結果としてオフラインDDL全体の実行効率に影響を与えます。インデックスの再構築時にパラメータの変更が必要な場合は、パラメータリストに
typeとdistanceの両方を指定する必要があり、かつtypeとdistanceは元のインデックスタイプと一致している必要があります。例えば、元のインデックスタイプがhnsw、距離アルゴリズムがl2の場合、再構築時にはtype=hnswとdistance=l2を同時に指定する必要があります。インデックスの再構築時には以下の操作がサポートされます:
m、ef_search、ef_constructionの値を変更する。- IVF/IVF_PQでは、V4.4.2 BP1バージョンで
nlist、sample_per_nlist、distance、nbits、mの値を変更できます。ここでmとnbitsはIVF_PQインデックス独自のパラメータです。 ef_searchパラメータのオンライン再構築。hnsw<->hnsw_sqインデックスタイプの再構築。ivf_flat<->ivf_flat、ivf_pq<->ivf_pqインデックスタイプの再構築。- 再構築時の並列度設定をサポートします。例については REBUILD_INDEX を参照してください。
インデックスの再構築時には以下の操作はサポートされません:
typeとdistanceタイプの変更。hnsw<->ivfインデックスの再構築。hnsw<->hnsw_bqインデックスの再構築。ivf_flat、ivf_pq間の相互再構築。
IVF/IVF_PQによるインデックス再構築の推奨事項(V4.4.2 BP1バージョンのみ適用):
REBUILD INDEXを実行する前に、ob_trx_timeoutパラメータの値をインデックス再構築(rebuild)に必要な時間より長く設定することを推奨します。これにより、タイムアウト問題を回避できます。
再構築パラメータの構成
マージの時間帯が多い場合や業務のピーク時には、リソーススケジューリングの競合により再構築に失敗することがあります。その場合は、DBMS_VECTOR.SET_ATTRIBUTE PLシステムパッケージを使用してインデックスの再構築トリガー周期を設定し、マージの時間帯や業務のピークを回避できます。
SET_ATTRIBUTE を使用すると、単一のベクトルインデックスに対し、自動再構築の並列度、トリガーしきい値、およびトリガー周期を設定できます。
-- rebuild の並列度を設定する
CALL DBMS_VECTOR.SET_ATTRIBUTE('idx1', 't1', 'parallel', '20');
-- rebuild のトリガーしきい値を設定する(増分データがベースラインの 50% に達した場合にトリガー)
CALL DBMS_VECTOR.SET_ATTRIBUTE('idx1', 't1', 'rebuild_trigger_percentage', '0.5');
-- rebuild のトリガー周期を設定する:600 秒ごとに確認
CALL DBMS_VECTOR.SET_ATTRIBUTE('idx1', 't1', 'rebuild_repeat_interval', 'FREQ=SECONDLY; INTERVAL=600');
-- rebuild のトリガー周期を設定する:毎日 19:45:00 に確認
CALL DBMS_VECTOR.SET_ATTRIBUTE('idx1', 't1', 'rebuild_repeat_interval', 'FREQ=DAILY; byhour=19;byminute=45;bysecond=0');
使用時の注意事項は次のとおりです。
- インデックスごとに
rebuild_repeat_intervalをずらし、同一時間帯への再構築の集中を避けてください。
パラメータの説明、制約および例については、SET_ATTRIBUTEを参照してください。
自動パーティション再構築(推奨)
注意
現在のバージョンでは、自動パーティション再構築タスクがトリガーされるシナリオは2つあります:
- ベクトルインデックス検索ステートメントを実行する場合。
- 定時チェック。実行間隔は手動で設定できます。
実行間隔の設定
oceanbaseデータベースで、パラメータvector_index_optimize_duty_timeを使用して実行間隔を設定します。例:ALTER SYSTEM SET vector_index_optimize_duty_time='[23:00:00, 24:00:00]';上記の設定が完了すると、パーティション再構築タスクは23:00:00~24:00:00の時間帯にのみ実行され、他の時間帯では実行されません。詳細なパラメータ説明については、対応するパラメータドキュメントを参照してください。
タスクの進捗状況/履歴タスクの確認
CDB/DBA_OB_VECTOR_INDEX_TASKSまたはCDB/DBA_OB_VECTOR_INDEX_TASK_HISTORYビューを使用して、タスクの進捗状況や履歴タスクを確認できます。
statusフィールドでタスクの現在の状態を判断します:- 0(PREPARE)、タスクが実行待ちの状態です。
- 1(RUNNING)、タスクが実行中です。
- 2(PENDING)、タスクの実行が一時停止されています。
- 3(FINISHED)、タスクが完了しました。
実行終了したタスク、つまり
status=FINISHEDのタスクは、実行成功の有無にかかわらず履歴テーブルに転送されます。詳細な使用例については、対応するビューのドキュメントを参照してください。タスクのキャンセル
タスクをキャンセルする場合は、
DBA_OB_VECTOR_INDEX_TASKSまたはCDB_OB_VECTOR_INDEX_TASKSビューでtrace_idを取得し、以下のコマンドを実行します:ALTER SYSTEM CANCEL TASK <trace_id>;例:
ALTER SYSTEM CANCEL TASK "Y61480BA2D976-00063084E80435E2-0-1";