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

このページでは、ベクトル インデックスのメンテナンス方法について説明します。インデックスをメンテナンスすると、検索結果の精度に影響する可能性があるデータの変化にインデックスを適応させることができます。データセットが拡大するにつれ、クエリのパフォーマンスが低下しないように、このページで説明する方法を使用してください。

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

テーブルの更新や挿入が頻繁に発生する場合は、インデックスの再現率と精度を高めるために、既存の ScaNN インデックスを定期的に再作成することをおすすめします。インデックス指標をモニタリングすることで、インデックス作成以降のベクトル分布やベクトル ミューテーションの変化を確認し、必要に応じてインデックスを再作成できます。

指標の詳細については、ベクトル インデックスの指標を表示するをご覧ください。

インデックスを自動でメンテナンスする

ScaNN インデックスを作成する際、scann.enable_preview_features データベース フラグ(GUC)とインデックスレベルの auto_maintenance パラメータを組み合わせて使用できます。これらの設定を組み合わせることで、AlloyDB はインデックスを段階的に管理し、データセットが拡大する際に大きな外れ値のパーティションを分割します。AlloyDB では、パーティションを分割することで、より高い QPS と検索結果の向上が図られます。

自動メンテナンスの結果としてインデックスに加えられた変更は、AlloyDB がインデックスを再度更新するまで保持されます。

AlloyDB でインデックスを自動的にメンテナンスできるようにするには、scann.enable_preview_features フラグを有効にします。

gcloud alloydb instances update INSTANCE_ID \
     --database-flags scann.enable_preview_features=on \
     --region=REGION_ID \
     --cluster=CLUSTER_ID \
     --project=PROJECT_ID

次のように置き換えます。

  • INSTANCE_ID: インスタンスの ID。
  • REGION_ID: インスタンスが配置されているリージョン(例: us-central1)。
  • CLUSTER_ID: インスタンスが配置されているクラスタの ID。
  • PROJECT_ID: クラスタが配置されるプロジェクトの ID。

scann.enable_preview_features フラグを有効にすると、インデックスの自動メンテナンスを有効にできます。また、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 でのインデックス再作成の詳細については、インデックス再作成をご覧ください。

次のステップ