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

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

始める前に

  • vector 拡張機能と alloydb_scann 拡張機能をインストールまたは更新します。

    1. vector 拡張機能と alloydb_scann 拡張機能がインストールされていない場合は、最新バージョンの拡張機能をインストールします。

      CREATE EXTENSION IF NOT EXISTS vector;
      CREATE EXTENSION IF NOT EXISTS alloydb_scann;
      
    2. vector 拡張機能と alloydb_scann 拡張機能がすでにインストールされている場合は、拡張機能を最新バージョンにアップグレードします。

      ALTER EXTENSION vector UPDATE;
      ALTER EXTENSION alloydb_scann UPDATE;
      

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

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

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

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

インデックスの自動メンテナンス機能により、AlloyDB はインデックスを段階的に管理できます。データセットが大きくなると、AlloyDB は重心を継続的に分析して更新し、大きな外れ値のパーティションを分割します。これにより、同等のクエリ数(QPS)と検索結果の品質のインデックスを維持できます。自動メンテナンスによって行われた更新は、次のメンテナンスが実行されるまで保持されます。

ScaNN インデックスを作成する際、scann.enable_preview_features データベース フラグ(GUC)とインデックスレベルの auto_maintenance パラメータを組み合わせて使用すると、ScaNN インデックスの自動インデックス メンテナンスを有効にできます。

自動インデックス メンテナンス機能は、自動調整された ScaNN インデックスでデフォルトで有効になっています。手動で作成したインデックスの場合、scann.enable_preview_features フラグを有効にした後、インデックスの作成時に auto_maintenance パラメータを設定するか、scann_index_maintenance 関数を使用して、オンデマンドで自動インデックス メンテナンスをトリガーできます。

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。

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

インデックスの作成時に自動メンテナンスを有効にする

自動インデックス メンテナンスが有効になっている手動 ScaNN インデックスを作成するには、次のサンプル コマンドを実行します。

CREATE INDEX INDEX_NAME ON TABLE \
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION) \
WITH (mode=MANUAL, 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 インデックスをチューニングするをご覧ください。

scann.max_background_workers データベース フラグを構成すると、複数のインデックスにわたる自動インデックス メンテナンスのスループットを増やすことができます。ワーカーの数を増やすと、単位時間あたりに処理されるインデックスの数が増えますが、単一のインデックスの処理時間が短縮されるわけではありません。必要に応じて、scann.maintenance_background_naptime_s データベース フラグを設定して、自動インデックス メンテナンスの実行間の最小遅延を制御することもできます。

自動インデックス メンテナンス用に pct_leaves_to_search を構成する

インデックスの自動メンテナンスを有効にしている場合、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 の割合。

インデックス メンテナンスを手動で呼び出す

特定のインデックスのメンテナンスをオンデマンドで呼び出す場合は、次のコマンドを実行します。この関数は alloydb_scann バージョン 0.1.2 以降で使用できます。

この関数を使用するには、インデックスを自動的に維持するの説明に沿って、最初に scann.enable_preview_features フラグを有効にする必要があります。

SELECT scann_index_maintenance('INDEX_NAME');

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

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

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

REINDEX INDEX CONCURRENTLY INDEX_NAME;

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

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

次のステップ