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

ドキュメントのバージョンを選択します。

ベクトル インデックスをメンテナンスして、検索結果の精度に影響する可能性のある変更にベクトル インデックスが適応できるようにします。

始める前に

インデックス メンテナンスを管理する前に、vector 拡張機能と alloydb_scann 拡張機能をインストールまたは更新します。

  • vector 拡張機能と alloydb_scann 拡張機能がインストールされていない場合は、インストールします。

    CREATE EXTENSION IF NOT EXISTS vector;
    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    
  • vector 拡張機能と alloydb_scann 拡張機能がすでにインストールされている場合は、更新します。

    ALTER EXTENSION vector UPDATE;
    ALTER EXTENSION alloydb_scann UPDATE;
    

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

AlloyDB Omni でベクトル インデックスを自動的に管理できます。データセットが大きくなると、AlloyDB Omni はセントロイドを分析して更新し、大きな外れ値のパーティションを分割します。これにより、秒間クエリ数(QPS)と検索結果の品質が自動的に向上します。自動更新は、次のメンテナンスが実行されるまで保持されます。

AlloyDB Omni では、自動的にチューニングされる ScaNN インデックスに対して、デフォルトで自動インデックス メンテナンスが有効になっています。自動的にチューニングされる ScaNN インデックスを作成するが、自動メンテナンスを無効にする場合は、自動インデックスの自動メンテナンスを無効にするをご覧ください。

手動で作成したインデックスの自動メンテナンスを有効にするには、 インデックスの作成時に自動メンテナンスを有効にするをご覧ください。

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

インデックスの作成時に自動メンテナンスを有効にするには、auto_maintenance パラメータを on に設定します。たとえば、ScaNN ベクトル インデックスを作成する次のコマンドをご覧ください。

CREATE INDEX INDEX_NAME ON TABLE_NAME \
USING scann (EMBEDDING_COLUMN_NAME DISTANCE_FUNCTION_NAME) \
WITH (mode='INDEX_MODE', num_leaves=NUM_PARTITIONS, auto_maintenance=on);

次の変数を置き換えます。

  • INDEX_NAME: 作成するインデックスの名前。例: my_scann_index。インデックス名はデータベース全体で共有されます。各インデックス名はデータベース内の各テーブルで一意となるようにしてください。

  • TABLE_NAME: インデックスを追加するテーブル。

  • EMBEDDING_COLUMN_NAME: インデックスを作成する vector データを格納する列。

  • DISTANCE_FUNCTION_NAME: このインデックスで使用する距離関数。次のいずれかを選択します。

    • L2 距離: l2

    • ドット積: dot_product

    • コサイン距離: cosine

  • INDEX_MODE: ScaNN インデックスを作成するモード。使用できる値は次のとおりです。

    • AUTO: AlloyDB Omni は、インデックスの構造を自動的に管理してチューニングします。modeAUTO に設定されている場合、デフォルトの auto_maintenance 値は on です。

    • MANUAL: ScaNN インデックスを手動で管理してチューニングします。modeMANUAL に設定されている場合、デフォルトの auto_maintenance 値は off です。

    使用するインデックス モードの詳細については、 ScaNN インデックスを作成するをご覧ください。

  • NUM_PARTITIONS: このインデックスに適用するパーティションの数。31048576 の任意の値に設定します。この値を決定する方法の詳細については、 インデックスをチューニングするをご覧ください。ScaNN

既存のインデックスの自動メンテナンスを構成する

既存の手動インデックスの自動メンテナンスを構成するには、次のコマンドを実行します。

ALTER INDEX INDEX_NAME SET (auto_maintenance = AUTOMATIC_MAINTENANCE);

次の変数を置き換えます。

  • INDEX_NAME: 変更するインデックスの名前。例: my_scann_index

  • AUTOMATIC_MAINTENANCE: 自動メンテナンスを有効または無効にします。有効にするには、値を on に設定します。 無効にするには、値を off に設定します。

自動メンテナンスのスループットを向上させる

自動メンテナンスのスループットを向上させるには、 scann.max_background_workers データベース フラグを構成します。バックグラウンド ワーカーの数を増やすと、単位時間あたりに処理されるインデックスの数が増えます。個々のインデックスの処理時間は短縮されません。この値は、データベース クラスタに設定された max_worker_processes の値よりも小さくする必要があります。

データベース フラグの構成の詳細については、 データベース パラメータを構成するをご覧ください。

自動メンテナンスの遅延を増やす

自動メンテナンスの実行間隔を長くするには、 scann.maintenance_background_naptime_s データベース フラグを構成します。

データベース フラグの構成の詳細については、 データベース パラメータを構成するをご覧ください。

パーティションの検索割合

AlloyDB Omni が大きな外れ値のパーティションを自動的に分割してパーティション数が増加したら、最適なパフォーマンスを維持するために、検索対象のリーフ数を調整することをおすすめします。この数を自動的に管理するには、scann.pct_leaves_to_search パラメータを構成します。

scann.pct_leaves_to_search は、検索する現在のパーティションの割合を表します。このパラメータは、0100 の任意の値に設定できます。デフォルト値は0です。このパラメータは無効になり、代わりに scann.num_leaves_to_search に設定された値が使用されます。scann.num_leaves_to_search0 に設定されている場合、AlloyDB Omni はデフォルトでリーフの 1% になります。

データセットが大幅に増加すると予想される場合は、初期値を 1 に設定します。

scann.pct_leaves_to_search を設定するには、次のコマンドを実行します。

ALTER DATABASE DB_NAME SET scann.pct_leaves_to_search = PERCENTAGE_PARTITIONS_TO_SEARCH;

次の変数を置き換えます。

  • DB_NAME: データベースの名前。
  • PERCENTAGE_PARTITIONS_TO_SEARCH: 検索するパーティションの割合。

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

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

SELECT scann_index_maintenance('INDEX_NAME');

INDEX_NAME は、メンテナンスを呼び出すインデックスの名前に置き換えます。例: my_scann_index

自動インデックスの自動メンテナンスを無効にする

自動的にチューニングされる ScaNN インデックスの自動メンテナンスを無効にするには、インデックスの作成時に auto_maintenance パラメータを OFF に設定します。たとえば、自動的にチューニングされる ScaNN インデックスを作成する次のコマンドをご覧ください。

CREATE INDEX similarity_index ON products
       USING scann (description_embedding cosine)
WITH (MODE = 'AUTOMATIC', auto_maintenance = 'OFF');

既存の自動的にチューニングされる ScaNN インデックスの自動メンテナンスを無効にする場合は、 既存のインデックスの自動メンテナンスを構成するをご覧ください。

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

テーブルの更新や挿入が頻繁に発生する場合は、再現率と精度を高めるために、ScaNN インデックスを定期的に再構築することをおすすめします。インデックスの作成以降のベクトル分布またはミューテーションの変化を確認する方法の詳細については、 ベクトル インデックス指標を表示するをご覧ください。

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

REINDEX INDEX CONCURRENTLY INDEX_NAME;

INDEX_NAME は、再構築するインデックスの名前に置き換えます。例: my_scann_index

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

次のステップ