適用於: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
動態管理檢視會 sys.dm_db_vector_indexes 即時回傳向量指數健康狀況及背景維護資訊。 使用此視圖監控 DiskANN 圖的追趕操作,並識別可能需要注意的向量索引。
| 欄位名稱 | 資料類型 | 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;