ベクトル インデックスの統計情報

このページでは、ベクトル インデックスに関する統計情報を保存する Spanner の組み込みテーブルについて説明します。ベクトル インデックスの統計情報を使用すると、ベクトル インデックスのパフォーマンスを確認して改善できる領域を特定し、指標に基づいてインデックスをチューニングできます。

SQL ステートメントを使用すると、SPANNER_SYS.VECTOR_INDEX_STATS テーブルから統計情報を取得できます。

Spanner は、SPANNER_SYS スキーマにベクトル インデックスの統計情報を提供します。SPANNER_SYS データにアクセスするには、次の方法を使用できます。

ベクトル インデックスの統計情報

SPANNER_SYS.VECTOR_INDEX_STATS には、データベース内の各ベクトル インデックスに関する統計情報が STATISTICS_COLLECTION_TIMESTAMP で並べ替えられて格納されます。Spanner は、3 日ごとに各ベクトル インデックスに関するデータを収集します。データが収集されると、Spanner はすぐに VECTOR_INDEX_STATS テーブルでデータを使用できるようにします。この表の情報からインデックスに関する分析情報を取得し、推奨事項をチューニングして適用することで、ベクトル検索のパフォーマンスを向上させることができます。

列名 説明 チューニングのガイダンス
START_TIME Spanner がインデックス指標を収集した時刻。 該当なし
VECTOR_INDEX_NAME CREATE VECTOR INDEX ステートメントで指定されたベクトル インデックスの名前。 該当なし
NUM_LEAVES このベクトル インデックスで使用されるリーフ(クラスタとも呼ばれます)の総数。この数は、ベクトル インデックスの作成時に決定されます。Spanner がベクトル インデックスを適応的に再形成するため、時間の経過とともに変化する可能性があります。 作成後にインデックス付きテーブルに多くの行が追加されると、一部のクラスタが非常に大きくなり、クエリのレイテンシに影響する可能性があります。インデックス内のクラスタ数がテーブルの行数の平方根以上である場合は、クラスタ数を増やしてインデックスを再構築することをおすすめします。
NUM_ZERO_SIZE_CLUSTERS_SAMPLED ベクトル インデックス内の空のクラスタのサンプリングされた数。空のクラスタには行が割り当てられていません。

テーブルから行が追加および削除されると、一部のクラスタが空になることがあります。空のクラスタが多い場合、ベクトル インデックスが古い可能性があります。クラスタの 10% 以上が空の場合は、クラスタ数を減らしてインデックスを再構築することを検討してください。大規模なベクトル インデックスの場合、Spanner はランダム サンプリングを使用して測定の費用を制限します。したがって、この指標はサンプリングされたサイズ 0 のクラスタの数を表します。これをサイズゼロのクラスタの推定数に変換するには、次のクエリを使用します。

SELECT NUM_ZERO_SIZE_CLUSTERS_SAMPLED / NUM_CLUSTERS_SAMPLED AS ESTIMATED_PERCENT_OF_CLUSTERS_WITH_SIZE_ZERO

CLUSTER_SIZE_PERCENTILES ベクトル インデックスは、インデックス付きエンベディングを近傍ベクトルのクラスタに分割します。この分布列には、これらのクラスタのサイズのパーセンタイル値が表示されます。 ベクトル インデックス作成を支える K 平均法クラスタリング プロセスでは、通常、さまざまなサイズのクラスタが生成されます。そのため、ある程度の不均衡が生じることが予想されます。クラスタサイズに大きな偏差がある場合、大きなクラスタを検索するとクエリのパフォーマンスが低下します。99 パーセンタイルのクラスタサイズが 50 パーセンタイルのクラスタサイズの 8 倍以上の場合、偏差は大きくなります。クエリ例 1 をご覧ください。
CLUSTER_AVERAGE_DISTANCE_TO_CENTROID_PERCENTILES 各クラスタには中心点(セントロイド)があります。高い再現率を実現するために、通常、ベクトルはインデックスの作成時に選択した構成に従って、近くのセントロイドに割り当てられます。Spanner は、クラスタごとに、セントロイドから割り当てられたすべてのベクトルまでの推定平均距離を計算します。クラスタ間の自然なばらつきにより、Spanner はこの指標を分布としてレポートします。これは、パーセンタイル値のリストとして示されます。 この指標は、ベクトル インデックス間で比較できません(特に、ユークリッド インデックスとコサイン インデックスは異なる方法でスケーリングされます)。この指標は、各ベクトル インデックスについて個別に経時的に追跡します。99 パーセンタイルの値が過去の最小値から 2 倍になった場合は、インデックスを再構築して値を下げることを検討してください。クエリの例 2 をご覧ください。

クエリの例 1

次のクエリは、特定のベクトル インデックスの 99 パーセンタイルのクラスタサイズを中央値のクラスタサイズで割った値を経時的にレポートします。99 パーセンタイルのクラスタサイズが 50 パーセンタイルのクラスタサイズの 8 倍以上大きい場合は、インデックスの再構築を検討してください。」

 SELECT VECTOR_INDEX_NAME,
        START_TIME,
        SUM(CASE WHEN percentile = 99 THEN value_at_percentile ELSE 0 END)
        / SUM(CASE WHEN percentile = 50 THEN value_at_percentile ELSE 0 END) as cluster_size_imbalance
FROM (
  SELECT v.VECTOR_INDEX_NAME,
         v.START_TIME, d.percentile,
         d.value_at_percentile
  FROM SPANNER_SYS.VECTOR_INDEX_METRICS_HISTORY AS v,
  UNNEST(v.CLUSTER_AVERAGE_DISTANCE_TO_CENTROID_PERCENTILES)
AS d)
WHERE VECTOR_INDEX_NAME = "VecIndex2"
GROUP BY 1, 2;

クエリ出力

VECTOR_INDEX_NAME START_TIME cluster_size_imbalance
VecIndex2 2025-12-10 10:09:55.322415+00:00 3.288
VecIndex2 2025-12-07 10:10:02.362223+00:00 3.11
VecIndex2 2025-12-04 10:09:55.180895+00:00 2.98
VecIndex2 2025-12-01 10:10:01.680543+00:00 3.01
VecIndex2 2025-11-28 10:10:02.130079+00:00 2.99

クエリの例 2

次のクエリは、各ベクトル インデックスのセントロイドまでの 99 パーセンタイルの距離を時系列でレポートします。この指標は、再現率のパフォーマンスを間接的に示すものです。値の正確な意味は、エンベディングによって異なります。各ベクトル インデックスを個別に、また時系列として追跡します。特定のインデックスの 99 パーセンタイルの値が過去の最小値から 2 倍になった場合は、インデックスの再構築を検討してください。

SELECT v.VECTOR_INDEX_NAME,
       v.START_TIME,
       d.value_at_percentile AS distance_to_centroid_99p
FROM SPANNER_SYS.VECTOR_INDEX_METRICS_HISTORY AS v,
UNNEST(v.CLUSTER_AVERAGE_DISTANCE_TO_CENTROID_PERCENTILES) AS d
WHERE d.percentile=99
ORDER BY VECTOR_INDEX_NAME, START_TIME DESC;

クエリ出力

VECTOR_INDEX_NAME START_TIME distance_to_centroid_99p
ANNVectorBase_VI 2025-12-10 10:09:55.322415+00:00 1.109
ANNVectorBase_VI 2025-12-07 10:10:02.362223+00:00 1.11
ANNVectorBase_VI 2025-12-04 10:09:55.180895+00:00 1.18
ANNVectorBase_VI 2025-12-01 10:10:01.680543+00:00 1.11
ANNVectorBase_VI 2025-11-28 10:10:02.130079+00:00 1.04

データの保持

SPANNER_SYS.VECTOR_INDEX_METRICS_HISTORY システム テーブルには、過去 30 日間のデータが保持されます。

次のステップ