sys.dm_db_vector_indexes(Transact-SQL)

適用対象:SQL Server 2025 (17.x)Azure SQL DatabaseAzure SQL マネージド インスタンスMicrosoft Fabric の SQL データベース

sys.dm_db_vector_indexes動的管理ビューは、ベクトルインデックスの健康状態やバックグラウンドのメンテナンスに関するリアルタイム情報を返します。 このビューを使ってDiskANNグラフのキャッチアップ操作を監視し、注意が必要なベクトルインデックスを特定しましょう。

Transact-SQL 構文表記規則

列名 データの種類 Description
object_id int ベクトルインデックスを含むテーブルのオブジェクトID。
index_id int ベクトルインデックスの識別。
graph_catchup_pending_percent decimal(10,2) DiskANNグラフに組み込まれる予定の変更のおおよその割合。 バックグラウンドメンテナンスで保留変更が処理されるにつれて、値はゼロに近づいていきます。 グラフのキャッチアップタスクが実行されていなければ、値は NULL できます。
quantized_keys_used_percent decimal(10,2) ベクトルインデックスが使用する量子化された鍵空間の割合。
last_background_task_execution_time datetime2 最新のバックグラウンドメンテナンス作業が実行された時間帯。 NULL バックグラウンドタスクが実行されていなければ、
last_background_task_succeeded bit 最新のバックグラウンドメンテナンスタスクの成功状況。 1 成功、 0NULL 失敗、 はバックグラウンドタスクの実行が完了していないことを示します。
last_background_task_duration_seconds bigint 直近のバックグラウンドメンテナンス作業の所長は秒単位です。 NULL バックグラウンドタスクが実行されていなければ、
last_background_task_processed_inserts bigint 直近のバックグラウンドメンテナンスタスクで処理された挿入数。 NULL バックグラウンドタスクが実行されていなければ、
last_background_task_processed_deletes bigint 最新のバックグラウンドメンテナンスタスクで処理された削除件数。 NULL バックグラウンドタスクが実行されていなければ、
last_background_task_error_message nvarchar(max) 最新のバックグラウンドメンテナンスタスクでエラーメッセージが報告されました。 NULL エラーが報告されなかったり、バックグラウンドタスクが実行されていない場合。

注釈

このビューは、現在のデータベース内の各ベクトルインデックスに対して1行を返します。

ベクターインデックスは非同期バックグラウンドメンテナンスを用いて、挿入、更新、削除などのデータ変更をDiskANNグラフに組み込みます。 graph_catchup_pending_percent列は、グラフにまだ反映されていない変更のおおよその割合を示しています。

機能の可用性

ベクターデータ型とベクター関数は、SQL Server 2025、Azure SQL Database、Azure SQL Managed Instance、FabricのSQLデータベースで一般に利用可能です。

ベクターインデックスは一般的にAzure SQL Databaseで利用可能で、SQLデータベースは Fabric、Azure SQL Managed Instanceは常にup-to-date更新ポリシーで設定されています。

ベクターインデックスはSQL Server 2025のプレビュー機能であり、SQL Server 2025年のアップデートポリシーで設定Azure SQL Managed Instanceされています。

分析する graph_catchup_pending_percent

graph_catchup_pending_percent列は、まだDiskANNグラフに組み込まれていないデータ変更のおおよその割合を示しています。

ベクターインデックス付きのテーブルに行を挿入、更新、削除しても、その変更はすぐにグラフに反映されません。 変更はキューイングされ、バックグラウンドのメンテナンスタスクによって非同期処理されます。

データ変更後には一時的なゼロでない値が期待されます。 バックグラウンドメンテナンスが保留中の変更をグラフに組み込むにつれて、パーセンテージはゼロに近づいています。

値がゼロの場合は、グラフの保守が追いついたことを示します。 NULL値は、まだグラフのキャッチアップタスクが実行されていないことを示すことがあります。

VECTOR_SEARCH クエリへの影響

VECTOR_SEARCH グラフの追いつきが進行中でも動作を続けます。 現在のDiskANNグラフに加え、まだ完全にグラフに組み込まれていない変更を加えています。

この動作は、次のことを意味します。

  • VECTOR_SEARCH 最近挿入された行や更新された行も考慮できます。
  • グラフに完全に組み込まれていない行は、グラフナビゲーションの恩恵を十分に活用できません。
  • 大規模なグラフのキャッチアップバックログが処理されている間、検索パフォーマンスやリコールに影響が出ることがあります。
  • 検索の質やパフォーマンスは、 graph_catchup_pending_percent がゼロまたは一貫して低いままの時に最も予測しやすいです。

グラフのキャッチアップ値を解釈する

高いグラフの追いつき率に対する普遍的な閾値は存在しません。 適切な閾値は、ワークロード、データ変更速度、データベース構成、予想される保守間隔によって異なります。

バッチロードやDML活動が高期間には、グラフのキャッチアップ率が一時的に増加することが予想されます。 作業負荷が減少した後、値がゼロに近づくかどうかを監視してください。

以下のいずれかの条件が観察された場合、ベクトル指数を調べてください。

  • 持続的なグラフの追いつきバックログ:graph_catchup_pending_percent 高めのままでゼロに近づきません。
  • バックグラウンドタスクの失敗:last_background_task_succeeded 0です。
  • バックグラウンドタスクエラー:last_background_task_error_message エラーが含まれています。
  • リコール率の低下:VECTOR_SEARCH 期待されるよりも関連性の高い結果が少ない。
  • 予期せぬパフォーマンス低下: ベクトル探索の遅延が増加し、グラフのキャッチアップバックログは高いままです。

NULL バックグラウンドタスク列の値が必ずしも失敗を示すわけではありません。 彼らは、まだバックグラウンドメンテナンス作業が実行されていないことを示すことができます。

ベクター インデックスを再構築するタイミング

測定可能な性能や劣化を思い出した場合、ベクトルインデックスの再構築を検討してください。 一時的なゼロでない graph_catchup_pending_percent 値だけでインデックスを再構築しないでください。

再建が適切なシナリオには以下のようなものがあります:

  • 著しい記憶低下: グラフの追いつき完了後、ベクトルサーチは予想されるより関連性の高い結果が少ない。
  • 大規模データ置換: データが別のモデルで再埋め込まれる場合など、ほとんどまたはすべての埋め込みが置き換えられます。
  • 持続的なメンテナンス問題: グラフのキャッチアップ率は減少せず、バックグラウンドメンテナンスは繰り返し失敗します。

詳細はベ クターインデックスのデータ品質および保守ガイダンスをご覧ください。

Permissions

データベースに対する VIEW DATABASE STATE 権限が必要です。

Examples

A. すべてのベクター インデックスを監視する

以下のクエリは、現在のデータベースにあるすべてのベクトルインデックスのグラフ、キャッチアップおよびバックグラウンドの保守情報を返します。

SELECT
    DB_NAME() AS database_name,
    OBJECT_SCHEMA_NAME(v.object_id) AS schema_name,
    OBJECT_NAME(v.object_id) AS table_name,
    i.name AS vector_index_name,
    v.graph_catchup_pending_percent,
    v.quantized_keys_used_percent,
    v.last_background_task_execution_time,
    v.last_background_task_succeeded,
    v.last_background_task_duration_seconds,
    v.last_background_task_processed_inserts,
    v.last_background_task_processed_deletes,
    v.last_background_task_error_message
FROM sys.dm_db_vector_indexes AS v
INNER JOIN sys.indexes AS i
    ON i.object_id = v.object_id
    AND i.index_id = v.index_id
ORDER BY
    v.graph_catchup_pending_percent DESC,
    schema_name,
    table_name,
    vector_index_name;

B. 特定のテーブルを監視する

以下のクエリは dbo.Articles テーブルのベクトルインデックス維持情報を返します:

SELECT
    OBJECT_SCHEMA_NAME(v.object_id) AS schema_name,
    OBJECT_NAME(v.object_id) AS table_name,
    i.name AS vector_index_name,
    v.graph_catchup_pending_percent,
    v.last_background_task_execution_time,
    v.last_background_task_succeeded,
    v.last_background_task_error_message
FROM sys.dm_db_vector_indexes AS v
INNER JOIN sys.indexes AS i
    ON i.object_id = v.object_id
    AND i.index_id = v.index_id
WHERE v.object_id = OBJECT_ID(N'dbo.Articles');

C. 注意が必要かもしれないインデックスを特定しましょう

以下の例では、15%を例示的なモニタリング閾値として用いています。 作業量に合った閾値を選択してください:

DECLARE @GraphCatchupThreshold decimal(10,2) = 15.0;

SELECT
    OBJECT_SCHEMA_NAME(v.object_id) AS schema_name,
    OBJECT_NAME(v.object_id) AS table_name,
    i.name AS vector_index_name,
    v.graph_catchup_pending_percent,
    v.last_background_task_execution_time,
    v.last_background_task_succeeded,
    v.last_background_task_error_message
FROM sys.dm_db_vector_indexes AS v
INNER JOIN sys.indexes AS i
    ON i.object_id = v.object_id
    AND i.index_id = v.index_id
WHERE
    v.graph_catchup_pending_percent > @GraphCatchupThreshold
    OR v.last_background_task_succeeded = 0
    OR v.last_background_task_error_message IS NOT NULL
ORDER BY v.graph_catchup_pending_percent DESC;