Oracle RACまたは単一インスタンスでのHNSW索引の移入メカニズムの理解
Oracle Real Application Clusters (Oracle RAC)または非RAC環境での索引作成、索引再移入またはインスタンス起動時に、Hierarchical Navigable Small World (HNSW)索引がどのように移入されるかについて説明します。
HNSW索引の作成および再移入
次の図は、Oracle RAC環境でHNSW索引を作成する場合の動作をまとめたものです:
-
HNSW索引を作成するRACインスタンスは、ディスク上にHNSW ROWIDとVIDのマッピング表を作成します。「HNSWベクトル索引のオプティマイザ計画」で説明されているように、この表は、オプティマイザが特定の最適化計画を実行するために必要です。
-
デフォルトでは、最初のHNSWグラフが作成されると、独自のHNSWインメモリー・グラフの作成を同時に開始するように、他のすべてのRACインスタンスに通知されます。この操作は、HNSW複製操作と呼ばれます。複製メカニズムでは、ディスク上のHNSWのROWIDとVIDのマッピング表を使用することで、多数の再計算が回避されるため、HNSWのROWIDとVIDのマッピング表が存在することによるメリットが得られます。
ノート:
ベクトルのメモリーが十分でないインスタンスは、RAC全体のパラレルHNSW索引移入に参加できません。ノート:
各RACインスタンスでは同じROWIDとVIDのマッピング表が共有されますが、各インスタンスのHNSWインメモリー・グラフは異なるものになることがあります。したがって、問合せを受け取るRACインスタンスに応じて異なる結果になる場合があります。この初期索引作成の場合に加えて、HNSW索引を完全に再移入する必要がある場合も、同じ複製メカニズムが使用されます。HNSW索引の完全再移入操作がトリガーされる理由およびタイミングの詳細は、「HNSW索引を使用した表のトランザクション・サポートの理解」を参照してください。
HNSWの完全チェックポイント
完全チェックポイントは、HNSWグラフのシリアライズされたバージョンであり、ディスクに格納され、HNSW多層グラフのすべての頂点とエッジが含まれています。完全チェックポイントは自己完結型で、対応するHNSWインメモリー・グラフとほぼ同じフットプリントを持ちます。「HNSW索引を使用した表のトランザクション・サポートの理解」で説明されているように、索引作成時と再移入操作時の両方で完全チェックポイントが作成されます。
HNSWの完全チェックポイントは、新しいインスタンスがOracle RACクラスタに参加するとき、またはインスタンスが再起動されるときのHNSWグラフの作成時間を短縮するために使用されます。ROWIDとVIDのマッピング表の使用または新しいグラフの作成ではなく、完全チェックポイントを使用する主な利点は、特定のベクトルの近傍がすでに計算され、完全チェックポイントに保持されていることです。
ノート:
HNSW完全チェックポイントは完全には最新のものではなく、一部のトランザクションが欠落している可能性がありますが(DMLごとにメンテナンスされないため)、ディスク上の共有ジャーナルから欠落しているベクトルを読み取ることで読取り一貫性が確保されている間は、最終的に最新の状態になります。共有ジャーナルは、HNSW索引によっても自動的に作成され、HNSW索引のトランザクション・サポート用のインスタンスが作成されます。共有ジャーナルの詳細は、「HNSW索引を使用した表のトランザクション・サポートの理解」を参照してください。HNSW索引を作成すると、完全チェックポイントの作成とメンテナンスがデフォルトで有効になります。
ノート:
HNSWの完全チェックポイントは、ユーザーの表領域に十分な領域がある場合にのみメンテナンスされます。DBMS_VECTOR
パッケージを使用して、完全なHNSWチェックポイントを無効または再度有効にできます:
-
無効は、特定の索引の既存の完全チェックポイントを削除し、新しい完全チェックポイントを作成しないことを意味します:
DBMS_VECTOR.DISABLE_CHECKPOINT(<schema owning indexes> [, <index name>])
-
有効(デフォルト)は、次のHNSWグラフ再移入によって特定のHNSW索引の完全チェックポイントが作成されることを意味します:
DBMS_VECTOR.ENABLE_CHECKPOINT(<schema owning indexes> [, <index name>] [, <tablespace name>])
詳細は、「ベクトル索引のステータス、チェックポイントおよびアドバイザのプロシージャ」のENABLE_CHECKPOINT
およびDISABLE_CHECKPOINT
プロシージャを参照してください。
カタログ表VECSYS.VECTOR$INDEX$CHECKPOINTS
を問い合せると、データベース・レベルで完全チェックポイントに関する情報を追跡できます。「VECSYS.VECTOR$INDEX$CHECKPOINTS」を参照してください。
インスタンス再起動時またはクラスタへの新しいノードの参加時のHNSW索引のリロード
HNSW索引はメモリー内に作成されるため、Oracle Databaseインスタンスが停止すると、HNSW索引を表す対応するインメモリー・グラフが失われます。デフォルトでは、インスタンスが再度起動されると、リロード・メカニズムがトリガーされ、HNSWグラフがメモリーにできるだけ早く再作成されます。このリロード・メカニズムは、Oracle RAC環境と非RAC環境の両方でデフォルトで有効になっています。
リロード・メカニズムの処理方法は、ディスク上にHNSWグラフの完全チェックポイントが存在するかどうかによって異なります。
次の図は、RAC環境でのリロード・メカニズムの概要を示しています:
-
索引の作成時に、ディスク上のインメモリーHNSWグラフおよびROWIDとVIDのマッピング表が作成されます。
-
ディスク上に完全チェックポイントも作成されます(有効な場合)。
-
共有ジャーナル構造も作成され、HNSW索引のトランザクションの一貫性を処理するために使用されます。
-
インスタンスがクラスタに参加したとき、または再起動時に、
VECTOR_INDEX_NEIGHBOR_GRAPH_RELOAD
インスタンス・パラメータがRESTART
(デフォルト設定)に設定されていて、完全なチェックポイントが存在し、現在のインスタンスのSCNと比較して古すぎるとはみなされない場合は、起動インスタンスによってそれが使用され、HNSWグラフがメモリー内に作成されます。これら2つの条件が満たされない場合、起動インスタンスは複製メカニズムを使用してメモリー内にHNSWグラフを最初から作成します。インスタンスがクラスタに参加したとき、または再起動時に、VECTOR_INDEX_NEIGHBOR_GRAPH_RELOAD
インスタンス・パラメータがOFF
に設定されている場合、HNSWグラフはリロードされません。
ノート:
完全チェックポイントは、作成SCNが現在のインスタンスのSCNと比較して古すぎない場合に、インスタンスのメモリー内にHNSWグラフをリロードするために使用されます。SCNが古すぎる場合、そのインスタンスは複製メカニズムを使用して索引の完全な再移入を実行します(前述のように)。ノート:
VECTOR_INDEX_NEIGHBOR_GRAPH_RELOAD
初期化パラメータ値によって、HNSW索引インメモリー・グラフを自動リロードするかどうかが制御されます。
親トピック: インメモリー近傍グラフ・ベクトル索引について