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 十進位(10,2) 等待被納入 DiskANN 圖的變更大致百分比。 隨著背景維護處理待處理變更,值會逐漸趨近於零。 值可以是 NULL ,如果沒有執行任何圖追趕任務。
quantized_keys_used_percent 十進位(10,2) 向量索引所佔量化鍵空間的百分比。
last_background_task_execution_time datetime2 就是最近一次背景維護任務執行的時候。 NULL 如果沒有執行背景任務。
last_background_task_succeeded 位元 最近背景維護任務的成功狀態。 1 表示成功、 0 失敗,以及 NULL 表示沒有背景任務執行。
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 如果沒有錯誤回報或沒有執行背景任務。

備註

此視圖會為目前資料庫中的每個向量索引回傳一列。

向量索引利用非同步背景維護,將資料修改(包括插入、更新與刪除)納入 DiskANN 圖中。 欄位 graph_catchup_pending_percent 顯示仍待納入圖表的變更大致百分比。

功能可用性

向量資料型態與向量函式通常可在 SQL Server 2025、Azure SQL Database、Azure SQL 受控執行個體 以及 Fabric 中的 SQL 資料庫中取得。

向量索引通常可在 Azure SQL Database 中取得,SQL 資料庫則在 Fabric,Azure SQL 受控執行個體 則以 Always-up-to-date更新政策配置。

向量索引是 SQL Server 2025 與 Azure SQL 受控執行個體 中以 SQL Server 2025 更新政策配置的預覽功能。

分析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 值重建指數。

可能適合重建的情境包括:

  • 顯著的回憶退化: 圖追趕完成後,向量搜尋回傳的相關結果比預期少。
  • 大規模資料替換: 大部分或全部嵌入都會被替換,例如資料重新嵌入到不同模型時。
  • 持續維護問題: 圖表追趕率沒有下降,背景維護卻屢屢失敗。

欲了解更多資訊,請參閱 向量指數的資料品質與維護指引。

許可

需要資料庫的 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;