増分データ量が多すぎると、検索性能が低下します。増分データテーブルのデータ量を減らすために、OceanBaseデータベースではDBMS_VECTORを使用してベクトルインデックスをメンテナンスする機能が導入されました。本記事では、OceanBaseベクトルインデックスのメンテナンス方法について説明します。
增量リフレッシュ
注意
IVF/IVF_PQインデックスには増分更新機能はありません。
インデックス作成後に大量のデータが書き込まれた場合、REFRESH_INDEX プロシージャを使用して増分更新を行うことを推奨します。詳細と例については、REFRESH_INDEXを参照してください。
増分更新は15分ごとにチェックされ、増分データが1万件を超えた場合に自動的に増分更新が実行されます。
全量リフレッシュ(リコンストラクト)
手動による全テーブル再構築
インデックスを構築した後、データの更新や削除が多かった場合、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の値を変更します。- V4.3.5 BP5バージョンで、IVF/IVF_PQの
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.3.5 BP5バージョンにのみ適用されます):
REBUILD INDEXを実行する前に、ob_trx_timeoutパラメータの値をインデックス再構築(rebuild)に必要な時間より大きい値に設定することを推奨します。これにより、タイムアウトの問題を回避できます。
自動パーティション再構築(推奨)
注意
現在のバージョンでは、自動パーティション再構築タスクがトリガーされるシナリオは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";