このページでは、ベクトル インデックスのメンテナンス方法について説明します。インデックスをメンテナンスすると、検索結果の精度に影響する可能性があるデータの変化にインデックスを適応させることができます。データセットが拡大するにつれ、クエリのパフォーマンスが低下しないように、このページで説明する方法を使用してください。
ベクトル インデックスの指標を表示する
テーブルの更新や挿入が頻繁に発生する場合は、インデックスの再現率と精度を高めるために、既存の ScaNN インデックスを定期的に再作成することをおすすめします。インデックス指標をモニタリングすることで、インデックス作成以降のベクトル分布やベクトル ミューテーションの変化を確認し、必要に応じてインデックスを再作成できます。
指標の詳細については、ベクトル インデックスの指標を表示するをご覧ください。
インデックスを自動でメンテナンスする
ScaNN インデックスの作成する際、scann.enable_index_maintenance
Grand Unified Configuration(GUC)データベース フラグとインデックスレベルの auto_maintenance
パラメータを組み合わせて使用できます。これらの設定を組み合わせることで、AlloyDB はインデックスを段階的に管理し、データセットが拡大するにつれて大きな外れ値のパーティションを分割します。AlloyDB では、パーティションを分割することで、より高い秒間クエリ数(QPS)と検索結果の向上が図られます。
自動メンテナンスによるインデックスの変更点は、AlloyDB がインデックスを再度更新するまで保持されます。
AlloyDB でインデックスを自動的にメンテナンスできるようにするには、shared_preload_libraries
パラメータに alloydb_scann
拡張機能を追加し、scann.enable_index_maintenance
データベース フラグを有効にします。続いて、データベースを再起動して alloydb_scann
拡張機能を読み込みます。
alloydb_scann
拡張機能をshared_preload_libraries
リストに読み込みます。sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,alloydb_scann'|" DATA_DIR/postgresql.conf
パラメータの構成が正しく設定されていることを確認します。
grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
postgresql.conf
ファイルでフラグを設定して、scann.enable_index_maintenance
フラグを有効にします。scann.enable_index_maintenance = ON
パラメータの変更を有効にするため、AlloyDB Omni を再起動します。
Docker
docker container restart CONTAINER_NAME
CONTAINER_NAME
は、起動時に AlloyDB Omni コンテナに割り当てた名前に置き換えます。Podman
podman container restart CONTAINER_NAME
CONTAINER_NAME
は、起動時に AlloyDB Omni コンテナに割り当てた名前に置き換えます。
scann.enable_index_maintenance
フラグを有効にすると、インデックスの自動メンテナンスを有効にできます。また、scann_index_maintenance
関数を有効にしてメンテナンスを手動で実行することも可能です。
インデックスの作成時に自動メンテナンスを有効にする
自動メンテナンスを有効にした ScaNN インデックスを作成するには、次のサンプル コマンドを実行します。
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, auto_maintenance=on);
次のように置き換えます。
INDEX_NAME
: 作成するインデックスの名前(例:my-scann-index
)。インデックス名はデータベース全体で共有されます。各インデックス名はデータベース内の各テーブルで一意となるようにしてください。TABLE
: インデックスを追加するテーブル。EMBEDDING_COLUMN
:vector
データを格納する列。DISTANCE_FUNCTION
: このインデックスで使用する距離関数。次のいずれかを選択します。L2 距離:
l2
ドット積:
dot_product
コサイン距離:
cosine
NUM_LEAVES_VALUE
: このインデックスに適用するパーティションの数。1~1048576 の任意の値に設定します。この値を決定する方法の詳細については、ScaNN
インデックスをチューニングするをご覧ください。
メンテナンスを手動で呼び出す
特定のインデックスのメンテナンスをオンデマンドで呼び出す場合は、次のコマンドを実行します。
SELECT AS scann_index_maintenance('INDEX_NAME');
リーフを管理して分割パーティションを自動で検索する
インデックスの自動メンテナンスを有効にしている場合、num_leaves
のしきい値に達すると AlloyDB によってパーティションが自動的に分割されます。こうした分割によりパーティション数が増加すると、最適なパフォーマンスを維持するために、検索対象のリーフ数を調整する必要があります。
検索対象のリーフ数を自動で管理するには、pct_leaves_to_search
を使用します。このパラメータを使用すると、検索対象のパーティション数の割合を指定できます。データセットが大幅に増加すると予想される場合は、pct_leaves_to_search
の値を 1 に設定することから始めてください。デフォルトでは、このパラメータは無効になっています。
この値は、現在のパーティション数の割合に設定します。たとえば、現在のパーティション数の 1% を検索するには、この値を 1
に設定します。
このパラメータは、0
~100
の任意の値に設定できます。デフォルト値の 0
ではこのパラメータが無効になり、scann.num_leaves_to_search
を使用して検索するリーフ数を計算します。
データベースに pct_leaves_to_search
フラグを設定するには、次のコマンドを実行します。
ALTER DATABASE DATABASE_NAME SET scann.pct_leaves_to_search = PERCENTAGE_LEAVES_TO_SEARCH;
次のように置き換えます。
DATABASE_NAME
: データベースの名前。PERCENTAGE_LEAVES_TO_SEARCH
: 検索するnum_leaves
の割合。
インデックスを手動で再構築する
作成時に指定した構成でインデックスを再構築する場合は、インデックスを手動で再構築できます。
インデックスを手動で再構築するには、次のコマンドを実行します。
REINDEX INDEX CONCURRENTLY INDEX_NAME;
INDEX_NAME
は、再構築するインデックスの名前に置き換えます(例: my-scann-index
)。インデックス名はデータベース間で共有されます。各インデックス名がデータベース内の各テーブルで一意であることを確認します。
PostgreSQL でのインデックス再作成の詳細については、インデックス再作成をご覧ください。