ベクトル インデックス指標

このページでは、AlloyDB Omni で生成するベクトル インデックスに関連する指標の一覧を示します。これらの指標は、alloydb_scann 拡張機能をインストールすると利用できる pg_stat_ann_indexes ビューを使用して表示できます。

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

ユーザビリティ指標

ユーザビリティ指標には、インデックス構成やインデックス スキャン数など、インデックス使用率の状態を把握する際に役立つ指標が含まれています。

指標名 データ型 説明
relid OID ベクトル インデックスを含むテーブルの固有識別子
indexrelid OID ベクトル インデックスの固有識別子
schemaname NAME インデックスを所有するスキーマの名前
relname NAME インデックスを含むテーブルの名前
indexrelname NAME インデックスの名前
indextype NAME インデックスの種類。この値は常に scann に設定されます。
indexconfig TEXT[] インデックスの作成時に定義された、リーフ数や量子化などの構成
indexsize TEXT インデックスのサイズ
indexscan BIGINT インデックスで開始されたインデックス スキャンの数

チューニング指標

チューニング指標を使用すると、現在のインデックスの最適化に関する分析情報を取得し、推奨事項を適用してクエリのパフォーマンスを向上させることができます。

指標名 データ型 説明
insertcount BIGINT インデックスに対する挿入オペレーションの数。この指標には、インデックスの作成前に存在していた行数も含まれます。
updatecount BIGINT インデックスに対する更新オペレーションの数。この指標には HOT アップデートは含まれません。
deletecount BIGINT インデックスに対する削除オペレーションの数。
distribution JSONB インデックスのすべてのパーティションにわたるベクトル分布。

次のフィールドに分布が表示されます。
  • maximum (INT8): すべてのパーティションにわたるベクトルの最大数。
  • minimum (INT8): すべてのパーティションにわたるベクトルの最小数。
  • average (FLOAT) : すべてのパーティションの平均ベクトル数。
  • outliers (INT8[]): すべてのパーティションの上位外れ値。この値は、上位 20 個の外れ値を示します。

注: K 平均法クラスタリング アルゴリズムの固有の特性により、インデックスの初期作成時であっても、パーティション間でベクトルの分布に常に一定のばらつきが生じます。
distributionpercentile JSONB ベクトル インデックス分布は、ScaNN インデックスのパーティション間のベクトルの分布を把握するのに役立ちます。パーティションは、インデックスの作成時に定義された num_leaves 値に基づいて作成されます。

ベクトル インデックス分布には、10 パーセンタイル、25 パーセンタイル、50 パーセンタイル、75 パーセンタイル、90 パーセンタイル、95 パーセンタイル、99 パーセンタイル、100 パーセンタイルのバケットが含まれています。各バケットには次の値が含まれます。
  • 指定されたパーセンタイルにあるパーティション内のベクトル数。
  • 現在のパーセンタイル値と前のパーセンタイル値で定義された範囲内にベクトルがあるパーティションの数。

注: K 平均法クラスタリング アルゴリズムの固有の特性により、インデックスの初期作成時であっても、パーティション間でベクトルの分布に常に一定のばらつきが生じます。

指標に基づくチューニングの推奨事項

ミューテーション
insertcountupdatecountdeletecount の指標を組み合わせると、インデックスのベクトルの変更またはミューテーションを確認できます。
インデックスは、特定の数のベクトルとパーティションを使用して作成されます。ベクトル インデックスに対して挿入、更新、削除などのオペレーションが実行されると、ベクトルが存在する最初のパーティション セットにのみ影響します。そのため、各パーティション内のベクトル数は時間とともに変動し、再現率、QPS、またはその両方に影響する可能性があります。
ANN 検索クエリで、時間の経過とともに QPS の低下や低い再現率などの速度や精度の問題が発生した場合は、これらの指標を確認することを検討してください。ベクトルの合計数に対してミューテーションの数が多い場合は、インデックスの再作成が必要になる可能性があります。
分布
distribution 指標は、すべてのパーティションにわたるベクトル分布を示します。
インデックスを作成すると、特定の数のベクトルと固定パーティションを使用して作成されます。パーティショニング プロセスとその後の分布は、この考慮事項に基づいて行われます。ベクトルが追加されると、既存のパーティションにパーティショニングされるため、インデックスの作成時とは異なる分布になります。最終的な分布ではすべてのベクトルが同時に考慮されないため、再現率、QPS、またはその両方に影響する可能性があります。
応答時間が長くなる、結果の精度が低下する(QPS または再現率で測定)など、ANN 検索クエリのパフォーマンスが徐々に低下している場合は、この指標を確認してインデックスを再作成することを検討してください。
分布パーセンタイル
distributionpercentile 指標は、pg_stat_ann_indexes ビューのベクトル インデックス分布です。ScaNN インデックスのパーティション間のベクトルの分布を把握するのに役立ちます。パーティションは、インデックスの作成時に定義された num_leaves 値に基づいて作成されます。
num_leaves を設定して最初の行セットに alloydb_scann インデックスを作成すると、データ操作(スキュー ミューテーション)により、パーティション全体のベクトルの分布がインデックスで変更されるか、ベクトルの数が大幅に増加する可能性があります。これらの変更により、QPS やリコール、またはその両方の低下が生じる可能性があります。ベクトル インデックス分布は、変異によってインデックス分布が変化したかどうかを示すシグナルになります。この情報は、インデックスの再作成が必要かどうか、検索時間の構成を変更することでクエリのパフォーマンスを高められるかどうかを判断するのに役立ちます。
ベクトル インデックスでは、パーティション間でベクトルが完全に均等に分散されることはほとんどありません。このような不均衡は非均一分布と呼ばれます。ある程度の不均一性は想定されることが多く、インデックスの再作成が必要になるわけではありません。非均一分布には次の特徴があります。
  • ベクトル数の分散が低い。分散は次のように計算できます。
    $(P100(num\_vectors) - p10(num\_vectors))*(\frac{num\_leaves}{total\_num\_row})$
  • ベクトルが 0 のパーティションの数は少なく、パーティションの 30% 未満になる可能性がある。
  • パーティション数の分散が低い。
    $ variance _{p} = abs(p_{num\_partitions} - num\_leaves * (p_{percentile} - p-1_{percentile})) $ ここで、「p」はベクトル インデックス分布バケットです。
  • 任意のパーセンタイルにおけるベクトルの数は次のようになる。
    $< 8 x (\frac{num\_rows\ during\ index\ creation\ time}{ num\_leaves})$

    これらの条件が満たされていない場合、QPS とリコールにどの程度影響するかに基づいて、REINDEX が必要になることがあります。
次のようなシナリオは、不均一な分布ほど一般的ではありませんが、発生する可能性があります。
  • 近似均一インデックス: ほとんどのパーティションにゼロ以外のベクトルが同じ数あり、ベクトル数の分散が低い場合、近似均一インデックスです。index_creation_time で各パーティション内のベクトル数が平均ベクトル数の 8 倍を超えている場合、REINDEX が必要になります。
  • スパース インデックス: パーティションの 50% 超が空の場合にも、スパース インデックスが作成されます。たとえば、テーブルで複数の削除が発生すると、スパース インデックスが作成されます。このシナリオでは、ベクトルが少数のパーティションに集中するため、各パーティション内のベクトル数が増加します。この場合は、インデックスを削除して再作成します。