적용 대상: SQL Server 2025(17.x)
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 데이터베이스
동적 관리 뷰는 sys.dm_db_vector_indexes 벡터 인덱스 건강 상태와 배경 유지보수에 관한 실시간 정보를 반환합니다. 이 뷰를 사용하여 DiskANN 그래프 캐치업 작업을 모니터링하고 주의가 필요한 벡터 인덱스를 식별할 수 있습니다.
| 열 이름 | 데이터 형식 | Description |
|---|---|---|
object_id |
int | 벡터 인덱스를 포함하는 테이블의 객체 ID. |
index_id |
int | 벡터 인덱스의 식별. |
graph_catchup_pending_percent |
decimal(10,2) | DiskANN 그래프에 반영될 변경 사항의 대략적인 비율. 백그라운드 유지보수가 대기 중인 변경 사항을 처리하면서 값은 0에 가깝게 움직입니다. 그래프 캐치업 작업이 실행되지 않았다면 이 값이 될 NULL 수 있습니다. |
quantized_keys_used_percent |
decimal(10,2) | 벡터 인덱스가 사용하는 양자화된 키 공간의 백분율. |
last_background_task_execution_time |
datetime2 | 가장 최근에 백그라운드 유지보수 작업이 실행된 시간.
NULL 백그라운드 작업이 실행되지 않았다면, |
last_background_task_succeeded |
bit | 가장 최근 배경 유지보수 작업의 성공 현황.
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 Managed Instance, Fabric의 SQL 데이터베이스에서 일반적으로 제공됩니다.
벡터 인덱스는 일반적으로 Azure SQL Database, SQL 데이터베이스는 Fabric에서 제공되며, Azure SQL Managed Instance 항상 up-to-날짜업데이트 정책으로 구성됩니다.
벡터 인덱스는 2025 SQL Server 미리보기 기능이며, SQL Server 2025 업데이트 정책으로 Azure SQL Managed Instance 설정되어 있습니다.
분석graph_catchup_pending_percent
이 열은 graph_catchup_pending_percent 아직 DiskANN 그래프에 반영되지 않은 데이터 변경 사항의 대략적인 비율을 나타냅니다.
벡터 인덱스가 있는 테이블에서 행을 삽입, 업데이트, 삭제할 때, 변경 사항이 즉시 그래프에 반영되지 않습니다. 변경 사항은 백그라운드 유지보수 작업을 통해 비동기적으로 큐에 저장되고 처리됩니다.
데이터 수정 후에는 임시로 0이 아닌 값이 예상됩니다. 백그라운드 유지보수가 그래프에 미결 변경 사항을 반영함에 따라 백분율은 0에 가까워집니다.
0이 되면 그래프 유지보수가 따라잡혔음을 나타냅니다. NULL 값은 아직 그래프 캐치업 작업이 실행되지 않았음을 나타낼 수 있습니다.
VECTOR_SEARCH 쿼리에 미치는 영향
VECTOR_SEARCH 그래프 따라잡기 중에도 계속 작동하고 있습니다. 현재 DiskANN 그래프와 아직 그래프에 완전히 반영되지 않은 변경 사항을 함께 사용합니다.
이 동작은 다음을 의미합니다.
-
VECTOR_SEARCH최근에 삽입되었거나 업데이트된 행도 여전히 고려할 수 있습니다. - 그래프에 완전히 통합되지 않은 행은 그래프 내비게이션을 최대한 활용할 수 없습니다.
- 대규모 그래프 캐치업 백로그가 처리되는 동안 검색 성능이나 리콜 능력에 영향을 받을 수 있습니다.
- 검색 품질과 성능은 0이 0이거나 지속적으로 낮을 때
graph_catchup_pending_percent가장 예측 가능합니다.
그래프 캐치업 값 해석
그래프 따라잡기 비율이 높은 보편적인 기준은 없습니다. 적절한 임계값은 작업 부하, 데이터 수정 속도, 데이터베이스 구성, 예상 유지보수 주기에 따라 달라집니다.
배치 로딩이나 DML 활동이 활발한 시기에는 그래프 캐치업 비율이 일시적으로 증가할 것으로 예상됩니다. 작업량이 줄어든 후 값이 0에 가까워지는지 모니터링하세요.
다음 조건 중 하나라도 관찰되면 벡터 지수를 조사하세요:
-
지속적인 그래프 밀린 기록:
graph_catchup_pending_percent여전히 높게 유지되며 0에 가까워지지 않습니다. -
배경 작업 실패:
last_background_task_succeeded0입니다. -
백그라운드 작업 오류:
last_background_task_error_message오류가 포함되어 있습니다. -
회상 감소:
VECTOR_SEARCH예상보다 적은 관련 결과를 반환합니다. - 예상치 못한 성능 저하: 벡터 탐색 지연이 증가하는 반면, 그래프 캐치업 백로그는 여전히 높게 유지됩니다.
NULL 백그라운드 작업 열의 값이 반드시 실패를 의미하지는 않습니다. 아직 백그라운드 유지보수 작업이 실행되지 않았음을 표시할 수 있습니다.
벡터 인덱스 다시 작성 시기
측정 가능한 성능이 관찰되거나 성능 저하를 기억할 때 벡터 지수를 재구성하는 것을 고려해 보세요. 임시 0이 아닌 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;