HNSW索引を使用した表のトランザクション・サポートの理解
Hierarchical Navigable Small World (HNSW)索引グラフは、静的メモリー専用構造です。HNSW索引を持つ表のトランザクションのメンテナンスは、プライベート・ジャーナルと共有ジャーナルの2つの主要な構造を使用して行われます。
プライベート・ジャーナルは、トランザクションによって追加または削除されたベクトルを追跡する、トランザクションごとのインメモリー・データ構造です(更新は実際には削除の後に挿入が実行されます)。これは、インメモリー列ストア・データの保守に使用されるトランザクション・ジャーナル(『Oracle Database In-Memoryガイド』を参照)に類似しています。これらのメモリー構造は、ベクトル・メモリー・プールから取り出され、読取り一貫性のために使用されます。
共有ジャーナルには、コミット・システム変更番号(SCN)および対応する変更された行が含まれています。この構造は、ベクトル索引の作成時に作成されたディスク上の構造です。コミット時に、プライベート・ジャーナルに記録された変更が行に変換され、共有ジャーナルにフラッシュされます。この構造は、読取り一貫性のためにも使用されます。
ノート:
-
バルクDML (
INSERT /*+ APPEND */
を使用した直接ロード)の場合、ベクトル・メモリー・プールへの負荷を回避するために、変更は共有ジャーナルで直接追跡されます。 -
完全再移入時(新しいHNSWグラフが使用可能になるまで)に、存在しなくなった古いバージョンのHNSWグラフに問合せでアクセスしようとすると、読取り一貫性エラー(
ORA 51815 "INMEMORY NEIGHBOR GRAPH HNSWベクトル索引スナップショットが古すぎます。"
)がトリガーされます。たとえば、SCN 100に古いHNSWグラフが存在するとします。完全再移入では新しいグラフがSCN 200で作成されますが(新しいROWIDとVIDのマッピング表が作成されます)、SCN 150で到着した問合せはSCN 200の新しいグラフにアクセスできません。これは、問合せの実行計画が、SCN 100の古いグラフに対応する古いROWIDとVIDのマッピング表を使用してコンパイルされるためです。
トランザクションの一貫性のために主に使用される前に定義した構造に加えて、インスタンスの再起動後にHNSW索引をより高速にリロードするために、ディスク上の完全なチェックポイント構造を維持することもできます(有効な場合)。HNSWグラフの索引作成および完全再移入時に、完全チェックポイントが自動的に作成されます。HNSWのチェックポイントはデフォルトで有効になっています。チェックポイントを無効または再度有効にするには、「ベクトル索引のステータス、チェックポイントおよびアドバイザのプロシージャ」を参照してください。
前に定義した構造と相互に結合して使用し、HNSW索引を持つ表に対するトランザクション・メンテナンスおよび読取り一貫性の全体的なパフォーマンスを向上させる方法を見てみましょう:
-
DMLの後に、メモリー内の既存のHNSWグラフと問合せのプライベート・ジャーナルおよび共有ジャーナルの両方を考慮して、削除および挿入された一連のベクトルのトランザクション一貫性のあるリストを判別することで、読取り一貫性が確保されます。これは、ジャーナルから削除されたベクトルの正確なリストを識別し、削除されたベクトルを無視するようにフィルタを拡張して、現在のバージョンのHNSW索引で近似top-K検索を実行し、ジャーナルに新しく挿入されたベクトルの正確なtop-k検索を実行して、2つの検索の結果をマージすることで構成されます。
次の図にこれを示します。
-
共有ジャーナルにDMLが蓄積されてくると、ディスク上のジャーナルの削除および挿入されたベクトルを完全一致検索すると、パフォーマンスが低下します。この影響を最小限に抑えるために、索引の完全な再移入が自動的にトリガーされます。HNSW索引をバックグラウンドで再移入するという決定は、索引に対して実行されるDMLの数の特定の割合を表すデフォルトのしきい値に基づきます。また、HNSW索引が作成または再移入されるたびに、新しく作成されたグラフの完全チェックポイントおよび新しいROWIDとVIDのマッピング表がディスク上に再作成されます。
次の図にこれを示します。
ノート:
完全な再移入時には、メモリー内にグラフのコピーが2つ必要となります。たとえば、新しい挿入が10%の場合、再移入されたグラフのベクトル・メモリーの要件は、メモリー内の元のHNSWグラフ・サイズより約10%多くなります。したがって、再移入中のピーク時のベクトル・メモリー要件では、再移入が終了して1.1倍に減少するまで、2.1倍のメモリーが必要になります。これは、新しいグラフの作成中に、以前のバージョンのグラフを使用して読取り一貫性を維持するために行われます。親トピック: インメモリー近傍グラフ・ベクトル索引について