ベクトル インデックスを維持する

このページでは、ベクトル インデックスの維持方法について説明します。インデックスを維持すると、検索結果の精度に影響する可能性のあるデータの変化にインデックスが適応するようにできます。データセットのサイズの増加に応じて、このページで説明する戦略を使用して、クエリのパフォーマンスの低下を防ぎます。

ベクトル インデックスの指標を表示する

テーブルの更新や挿入が頻繁に発生する場合は、インデックスの再現率と精度を高めるために、既存の 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 拡張機能を読み込みます。

  1. alloydb_scann 拡張機能を shared_preload_libraries リストに読み込みます。

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,alloydb_scann'|" DATA_DIR/postgresql.conf
  2. パラメータの構成が正しく設定されていることを確認します。

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. postgresql.conf ファイルでフラグを設定して、scann.enable_index_maintenance フラグを有効にします。

    scann.enable_index_maintenance = ON
  4. パラメータの変更を有効にするため、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 インデックスをチューニングするをご覧ください。

リーフを管理して分割パーティションを自動的に検索する

インデックスの自動メンテナンスが有効になっている場合、num_leaves しきい値に達すると AlloyDB はパーティションを自動的に分割します。これらの分割によりパーティション数が増加すると、最適なパフォーマンスを維持するために、検索するリーフの数を調整する必要があります。

検索するリーフの数を自動的に管理するには、pct_leaves_to_search を使用します。このパラメータを使用すると、検索するパーティション数の割合を指定できます。データセットが大幅に増加すると予想される場合は、まず pct_leaves_to_search 値を 1 に設定します。このパラメータはデフォルトで無効になっています。

この値は、現在のパーティション数の割合に設定します。たとえば、現在のパーティション数の 1% を検索するには、この値を 1 に設定します。

このパラメータには、0100 の間で任意の値を設定できます。デフォルト値は 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 の割合。

メンテナンスを手動で呼び出す

特定のインデックスのメンテナンスをオンデマンドで呼び出す場合は、次のコマンドを実行します。

SELECT scann_index_maintenance('INDEX_NAME');

インデックスを手動で再構築する

作成時に指定した構成でインデックスを再構築する場合は、インデックスを手動で再構築できます。

インデックスを手動で再構築するには、次のコマンドを実行します。

REINDEX INDEX CONCURRENTLY INDEX_NAME;

INDEX_NAME は、再構築するインデックスの名前に置き換えます(例: my-scann-index)。インデックス名はデータベース間で共有されます。各インデックス名がデータベース内の各テーブルで一意であることを確認します。

PostgreSQL でのインデックス再作成の詳細については、インデックス再作成をご覧ください。

次のステップ