적용 대상: SQL Server 2025(17.x)
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 데이터베이스
벡터 열에 근사 인덱스를 만들어 최근접 이웃 탐색 성능을 향상시킵니다. 벡터 인덱싱과 벡터 검색이 어떻게 작동하는지, 그리고 정확 검색과 근사 검색의 차이에 대해 더 알고 싶다면 SQL 데이터베이스 엔진의 벡터 검색 및 벡터 인덱스를 참조하세요.
기능 가용성
- 벡터 인덱스와
VECTOR_SEARCH는 일반적으로 Azure SQL Database에서 GA, Microsoft Fabric에서 SQL 데이터베이스, 그리고 항상up-to-날짜업데이트 정책으로 Azure SQL Managed Instance 있습니다. - 벡터 인덱스와
VECTOR_SEARCH는 SQL Server 2025(17.x)와 SQL Server 2025 업데이트 정책과 함께 제공되는 Azure SQL Managed Instance의 미리보기 기능입니다.
경고
폐지 공지: 이전 데이터 구조를 사용하여 생성된 벡터 인덱스는 현재 버전에서 지원되지만, 향후 버전에서는 폐지될 예정입니다. 향후 호환성과 최신 벡터 검색 기능 접근을 보장하기 위해, 이전 벡터 인덱스 버전에서 마이그레이션 섹션의 단계를 사용하여 기존 벡터 인덱스를 마이그레이션하세요.
SQL Server 2025 미리보기 기능
SQL Server 2025와 SQL Server 2025업데이트 정책의 Azure SQL Managed Instance에서는 벡터 인덱스와 VECTOR_SEARCH 함수가 미리보기에 있으며 변경될 수 있습니다. 이 기능을 사용하려면 데이터베이스 범위 설정 설정을 PREVIEW_FEATURES 활성화해야 합니다.
사용 전에 현재 제한 사항을 확인하세요.
비고
벡터 인덱스의 최신 버전은 Azure SQL Database, SQL 데이터베이스는 Microsoft Fabric, 그리고 Always-up-to-date 업데이트 정책으로 Azure SQL Managed Instance 제공됩니다.
문법
CREATE VECTOR INDEX index_name
ON object ( vector_column )
[ WITH (
[ , ] METRIC = { 'cosine' | 'dot' | 'euclidean' }
[ [ , ] TYPE = 'DiskANN' ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
) ]
[ ON { filegroup_name | "default" } ]
[;]
주장들
index_name
인덱스의 이름입니다. 인덱스 이름은 테이블 내에서 고유해야 하지만 데이터베이스 내에서 고유할 필요는 없습니다. 인덱 스 이름은 식별자 규칙을 따라야 합니다.
개체
인덱스가 만들어지는 테이블입니다. 기본 테이블이어야 합니다. 로컬 테이블과 전역 모두의 임시 테이블은 지원되지 않습니다.
vector_column
벡터 인덱스 만들기에 사용할 열입니다. 벡터 형식이어야 합니다.
메트릭
지정된 두 벡터 간의 거리를 계산하는 데 사용할 거리 메트릭의 이름을 가진 문자열입니다. 지원되는 거리 메트릭은 다음과 같습니다.
-
cosine- 코사인 거리 -
euclidean- 유클리드 거리 -
dot- (음수) 점 제품
TYPE
인덱스 작성에 사용되는 ANN 알고리즘 의 형식입니다. 현재는 DiskANN만 지원됩니다. DiskANN이 기본값입니다.
MAXDOP
인덱스 작업에 대한 최대 병렬 처리 수준 구성 옵션을 재정의합니다. 자세한 내용은 Server 구성을 참조하세요. 최대 병렬 처리 수준.
MAXDOP 사용하여 인덱스 빌드 작업에 대한 병렬 처리 수준 및 결과 리소스 사용을 제한합니다.
max_degree_of_parallelism은 다음 중 하나일 수 있습니다.
1병렬 계획 생성을 억제합니다.
>
1병렬 인덱스 작업에 사용되는 최대 병렬 처리 수준을 현재 시스템 워크로드에 따라 지정된 수 이하로 제한합니다.
0(기본값)현재 시스템 워크로드에 따라 감소하지 않는 한 서버, 데이터베이스 또는 워크로드 그룹 수준에서 지정된 병렬 처리 수준을 사용합니다.
병렬 인덱스 작업은 일부 SQL Server 버전에서 사용할 수 있습니다. SQL Server 에디션에서 지원하는 기능 목록은 SQL Server 2025의 에디션 및 지원 기능을 참조하세요.
벡터 인덱스를 최신 버전으로 업그레이드
중요합니다
지원 중단 공지: 현재 버전은 이전 데이터 구조를 사용하여 생성된 벡터 인덱스를 지원하지만, 향후 버전에서는 해당 지원이 종료될 예정입니다. 향후 호환성과 최신 벡터 검색 기능 접근을 보장하기 위해 다음 단계를 사용하여 기존 벡터 인덱스를 마이그레이션하세요.
새로 만든 벡터 인덱스는 다음을 제공하는 최신 데이터 구조를 자동으로 사용합니다.
-
전체 DML 지원: 인덱스를 만든 후 벡터 인덱싱된 테이블을 읽기 전용으로 만든 이전 제한을 제거합니다. 이제 벡터 인덱스 기능을 유지하면서 ,
UPDATEDELETEMERGE그리고 연산을 수행INSERT하면서 자동 실시간 인덱스 유지보수가 가능합니다. -
반복 필터링: 벡터 탐색 과정에서 절 내
WHERE술어를 적용하며, 검색(retrieval) 이후가 아닙니다. - 최적화 주도: 쿼리 최적화기는 쿼리 특성에 따라 DiskANN 인덱스 또는 kNN 검색 중 무엇을 사용할지 자동으로 결정합니다.
- 고급 양자화: 벡터 양자화 기법을 통합하여 저장 효율성과 쿼리 성능을 향상시킵니다. 이러한 최적화는 사용자에게 투명합니다.
이전 벡터 인덱스 버전 제한에 대한 자세한 내용은 '제한 사항 및 고려사항' 섹션을 참조하세요.
이전 벡터 인덱스 버전에서 마이그레이션
최신 기능을 활성화하려면 이전 버전을 사용하는 벡터 인덱스를 삭제하고 다시 만들어야 합니다. 이 섹션에서는 벡터 인덱스 버전을 식별, 마이그레이션 및 확인하는 방법을 설명합니다.
1단계: 기존 벡터 인덱스 식별
다음 쿼리를 사용하여 마이그레이션이 필요한 벡터 인덱스를 식별합니다.
SELECT
i.name AS index_name,
t.name AS table_name,
JSON_VALUE(v.build_parameters, '$.Version') AS index_version,
CASE
WHEN JSON_VALUE(v.build_parameters, '$.Version') >= '3'
THEN 'Uses latest version (no migration required)'
WHEN JSON_VALUE(v.build_parameters, '$.Version') < '3'
THEN 'Created using an earlier version (migration recommended)'
ELSE 'Unknown format'
END AS migration_status
FROM sys.vector_indexes AS v
INNER JOIN sys.indexes AS i
ON v.object_id = i.object_id
AND v.index_id = i.index_id
INNER JOIN sys.tables AS t
ON v.object_id = t.object_id
ORDER BY t.name, i.name;
결과를 해석하는 방법
최신 버전 사용
- 이미 반복 필터링, 완전한 DML 지원, 옵티마이저 기반 실행, 향상된 양자화를 지원합니다.
- 마이그레이션이 필요하지 않습니다.
이전 버전을 사용하여 생성됨
- 레거시 포스트 필터 동작을 사용합니다.
- 최신 벡터 검색 기능을 지원하지 않습니다.
- 향후 호환성을 보장하기 위해 마이그레이션이 강력히 권장됩니다.
2단계: 벡터 인덱스 삭제 및 다시 만들기
이전 형식을 사용하는 벡터 인덱스는 업그레이드할 수 없습니다. 최신 DiskANN 기능을 사용하도록 설정하려면 인덱스 삭제 및 다시 만듭니다.
경고
서비스 영향: 벡터 인덱스를 삭제하면 인덱스가 다시 만들어질 때까지 영향을 받는 테이블에서 대략적인 벡터 검색이 즉시 비활성화됩니다. 프로덕션 시스템에 대한 유지 관리 기간 동안 마이그레이션을 계획합니다.
기존 인덱스 삭제
DROP INDEX vec_idx ON dbo.wikipedia_articles;
인덱스 다시 생성
CREATE VECTOR INDEX vec_idx
ON dbo.wikipedia_articles (title_vector)
WITH (
TYPE = 'DISKANN',
METRIC = 'COSINE'
);
비고
현재 CREATE VECTOR INDEX 문장을 사용하여 생성된 벡터 인덱스는 자동으로 최신 DiskANN 형식을 사용합니다. 추가 옵션 또는 플래그가 필요하지 않습니다.
3단계: 인덱스 버전 확인
인덱스를 다시 만든 후에는 최신 버전을 사용하고 있는지 확인하세요:
SELECT
i.name AS index_name,
t.name AS table_name,
JSON_VALUE(v.build_parameters, '$.Version') AS index_version
FROM sys.vector_indexes AS v
INNER JOIN sys.indexes AS i
ON v.object_id = i.object_id
AND v.index_id = i.index_id
INNER JOIN sys.tables AS t
ON v.object_id = t.object_id
WHERE i.name = 'vec_idx';
열은 index_version 최신 버전에 대해 표시 3 되어야 합니다.
버전 비호환성 오류 동작
최신 버전 벡터 인덱스와 함께 매개 변수 TOP_N 를 사용 VECTOR_SEARCH 하려는 경우 SQL Server는 다음 오류를 반환합니다.
Msg 42274, Level 16, State 1
Vector search with version 3 index does not support explicit TOP_N parameter.
이 오류를 해결하려면 매개 변수를 TOP_N 제거하고 대신 구문을 사용합니다VECTOR_SEARCH.SELECT TOP (N) WITH APPROXIMATE 자세한 내용은 레거시 구문을 사용하는 오류를 참조하세요.
제한 사항 및 고려 사항
이전 벡터 인덱스 버전 제한 사항
초기 벡터 인덱스 버전에는 다음과 같은 제한이 있습니다. 인덱스 버전을 확인하려면 인덱스 버전 확인을 참조하세요.
필터링 후에만 적용: 술어는 벡터 검색 후에만 적용되며, 검색 과정 중에는 적용되지 않습니다. 이런 동작 때문에 필터를 적용할 때 예상보다 반환되는 행 수가 줄어들 수 있습니다.
읽기 전용 테이블: 벡터 인덱스가 있는 테이블은 읽기 전용입니다. 벡터 인덱스를 만든 후에는 DML 연산(
INSERT,UPDATE,DELETE)MERGE작업을 수행할 수 없습니다.ALLOW_STALE_VECTOR_INDEX부실 검색 결과를 허용할 수 있는 경우 데이터베이스 범위 구성을 사용하여 DML 작업을 사용하도록 설정합니다.수동 TOP_N 튜닝: 필터링 후 보정을 위해 매개변수
VECTOR_SEARCH를 수동으로 조정TOP_N해야 합니다. 원하는 결과를 얻기 위해서는 종종 과도한 값이 필요합니다.
현재 제한 사항(최신 버전에도 적용됨)
현재 미리 보기에는 다음과 같은 제한 사항이 있습니다.
벡터 인덱스는 분할할 수 없습니다.
테이블은 int 열에 기본 키 클러스터 인덱스를 가져야 합니다.
벡터 인덱스는 구독자에 복제되지 않습니다.
벡터 인덱스가 있는 테이블을 .로
TRUNCATE TABLE잘라낼 수는 없습니다. 모든 데이터를 제거하려면 먼저 벡터 인덱스를 삭제하고 테이블을 잘라내고 100개 이상의 행으로 다시 채우고 인덱스를 다시 만듭니다. 자세한 내용은 제한 사항을 참조하세요TRUNCATE TABLE.벡터 인덱스는 DacPac과 함께 배포할 수 없습니다. 벡터 인덱스가 포함된 데이터베이스는 DacFx 버전 170.5.96부터 BACPAC으로 배포할 수 있습니다. 벡터 인덱스는 테이블 데이터가 로드된 후에 생성되며, 인덱스된 테이블에는 벡터가 아닌
NULL값을 가진 최소 100행이 포함되어야 합니다.스키마 전용 DACPAC 배포 중에는, 대상 테이블에 벡터 값이 아닌
NULL100행 미만이라면 벡터 인덱스를 생성하지 않고도 배포가 성공할 수 있습니다. DacFx는 나중에 행을 추가할 때 자동으로 건너뛴 인덱스를 생성하지 않습니다. 최소 100개의 자격을 갖춘 행을 불러온 후, 배포 후 스크립트를 사용해 벡터 인덱스를 만들거나, DACPAC을 다시 게시하거나,CREATE VECTOR INDEX.가져오기 또는 배포 후, 벡터 인덱스가 생성되었는지 확인하여 쿼리를 수행
sys.vector_indexes하세요.DacFx 버전 170.5.96 이전에는 데이터베이스를 내보내기 전에 벡터 인덱스를 삭제하고, 가져오기 후에 인덱스를 다시 생성하는 방법이 있습니다.
최소 데이터 요구 사항
벡터 인덱스는 인덱스를 만들기 전에 최소 수의 비벡터 값을 가진NULL 행이 필요합니다.
-
최소 행 수: 테이블에는 벡터 값이 아닌
NULL행이 최소 100개 있어야 합니다. - 오류 동작: 100행 미만의 테이블에서 벡터 인덱스를 만들려고 하면 실패하고 오류 Msg 42266이 반환됩니다.
예제 오류:
Msg 42266, Level 16, State 1
Cannot create a vector index. The table contains only 8 rows with non-null vectors,
but at least 100 are required for vector index creation.
모범 사례: 벡터 인덱스를 만들기 전에 테이블을 100개 이상의 행으로 채웁니다. 개발 및 테스트 시나리오에서 줄 수가 적은 경우, VECTOR_SEARCH 인덱스 없이 무차별 대입 스캔 방식을 사용합니다. 하지만 이 방법은 데이터셋이 클수록 성능이 저하됩니다.
DML 지원
최신 버전을 사용해 DiskANN 벡터 인덱스를 만들면, 테이블은 더 이상 읽기 전용이 아닙니다. 표준 데이터 조작 언어(DML) 연산을 사용하여 데이터를 수정할 수 있으며, 변경 사항은 벡터 검색 결과에 자동으로 나타납니다.
이 기능을 사용하면 시간이 지남에 따라 데이터가 변경되는 실시간 트랜잭션 워크로드에 벡터 검색이 적합합니다.
동작 정보
- DML 작업은 벡터 인덱스를 삭제하거나 다시 작성할 필요가 없습니다.
- 변경 내용은 트랜잭션이 커밋된 후 벡터 검색 쿼리에 표시됩니다.
- 대규모 데이터 대체(예: 대부분의 행 삭제 및 완전히 새로운 포함 집합 삽입)의 경우 최적의 검색 품질을 보장하기 위해 데이터 로드 후 벡터 인덱스를 삭제하고 다시 만드는 것이 좋습니다.
비고
DML 지원은 최신 버전을 사용하여 생성된 벡터 인덱스에서만 제공됩니다. 이전 버전에서는 테이블이 읽기 전용이거나 데이터베이스 범위 구성을 ALLOW_STALE_VECTOR_INDEX 사용해야 합니다.
벡터 인덱스 유지 관리 모니터링
벡터 인덱스는 백그라운드 유지 관리를 수행하여 DML 변경 내용을 통합합니다. sys.dm_db_vector_indexes 동적 관리 뷰를 사용하여 인덱스 상태 및 유지 관리 작업 상태를 모니터링합니다.
기존 인덱스와 벡터 인덱스 결합
벡터 인덱스는 기존의 B-트리 인덱스와 함께 작동하여 최적의 쿼리 성능을 제공합니다. 반복 필터링을 VECTOR_SEARCH사용하는 경우 필터 조건자에 사용되는 열에 기존 인덱스를 만드는 것이 좋습니다.
반복 필터링 동작 및 이전 버전과 어떻게 다른지에 대한 자세한 내용은 반복 필터링 동작을 참조하세요.
팁 (조언)
쿼리 최적화 프로그램은 최상의 실행 전략(근사치 인접 인덱스 및 kNN 검색)을 자동으로 선택합니다. 근사한 인접 인덱스 사용을 강제하려면 테이블 힌트를 FORCE_ANN_ONLY 사용합니다. 자세한 내용은 벡터 검색에 대한 테이블 힌트를 참조하세요.
시나리오 예:
-- Create vector index for similarity search
CREATE VECTOR INDEX idx_embeddings_vector
ON product_embeddings(embedding)
WITH (METRIC = 'cosine');
-- Create traditional index for filter columns
CREATE NONCLUSTERED INDEX idx_embeddings_filters
ON product_embeddings(category);
성능 이점:
반복 필터링을 사용하여 쿼리를 실행할 때 SQL Server 쿼리 최적화 프로그램은 두 인덱스 형식을 모두 사용합니다.
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'wireless headphones' USE MODEL EmbeddingModel);
SELECT TOP (10) WITH APPROXIMATE
p.name,
p.price,
vs.distance
FROM products p
INNER JOIN VECTOR_SEARCH(
TABLE = product_embeddings AS e,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS vs ON p.id = e.product_id
WHERE e.approved = 1
AND e.category = 'Electronics' -- Can use traditional index
ORDER BY vs.distance;
이 쿼리에서:
- 벡터 인덱스는 쿼리 벡터를 기반으로 유사한 포함을 식별합니다.
- 반복 검색 프로세스 중에 후보를 효율적으로 필터링하는 기존 인덱
(category)스
이 복합 전략은 특히 필터 조건자의 선택성이 높은 경우 벡터 인덱스만 사용하는 것과 비교하여 쿼리 성능을 크게 향상시킬 수 있습니다.
벡터 인덱스에 대한 데이터 품질 및 유지 관리 지침
중복 포함이 많은 데이터 세트 방지
벡터 인덱싱은 포함이 다양한 의미 체계 콘텐츠를 나타내는 경우에 가장 적합합니다. 벡터 인덱싱에 중복 벡터 비율이 높은 데이터셋은 사용하지 마세요.
중복이 많을 경우 다음이 발생할 수 있습니다.
- 결과 품질 저하: 중복 벡터가 결과에 반복적으로 표시되어 관련 의미 체계 일치가 더 많이 발생합니다.
- 효율성 감소: 중복 포함은 더 나은 이웃을 대체하여 유사성 검색의 유용성을 낮춥니다.
- 불필요한 리소스 사용: 벡터 인덱스는 빌드 및 유지 관리 비용이 많이 들고 중복은 가치를 추가하지 않고 비용을 추가합니다.
모범 사례: 성능과 결과 품질을 모두 개선하기 위해 벡터 인덱스를 만들기 전에 포함을 중복 제거합니다.
대규모 데이터 대체 시나리오
벡터 인덱스는 삽입, 업데이트 및 삭제를 지원합니다. 하지만 대부분의 또는 모든 임베딩을 교체하면—예를 들어 데이터셋을 새 모델로 재임베딩하는 경우—기존 인덱스가 새로운 데이터 분포를 더 이상 반영하지 않을 수 있습니다.
대규모 대체 시나리오에서:
- 벡터 검색 쿼리는 계속해서 유효한 결과를 반환합니다.
- 기억력과 순위 품질이 저하될 수 있는데, 이는 지수 구조가 다른 임베딩 분포를 위해 만들어졌기 때문입니다.
모범 사례: 거의 완전한 데이터 대체(새 포함 항목 삭제 및 삽입)를 수행할 때 새 데이터를 로드한 후 벡터 인덱스를 삭제하고 다시 만듭니다. 인덱스를 다시 만들면 새 포함 배포에 최적화되고 예측 가능한 쿼리 동작이 복원됩니다.
알려진 문제
자세한 내용은 알려진 문제를 검토하세요.
권한
테이블 위에서 허락이 필요 ALTER 해.
예시
벡터 포함 샘플이 포함된 Wikipedia 문서를 다운로드하고 가져옵니다.
이 예시들은 위키백과 문서의 제목 임베딩을 저장하는 타입 vector 열 title_vector 을 가진 테이블 wikipedia_articles 을 가정합니다. 텍스트 title_vector-임베딩-ada-002 또는 텍스트-embedding-3-small과 같은 임베딩 모델을 사용하며, 1,536차원의 벡터를 반환합니다.
종단 간 솔루션을 포함한 더 많은 예시는 Azure SQL Database 벡터 검색 샘플 GitHub 저장소를 참조하세요.
예제 1
다음 예제에서는 메트릭을 사용하여 열에 title_vector 벡터 인덱스 만들기 cosine
CREATE VECTOR INDEX vec_idx
ON [dbo].[wikipedia_articles] ([title_vector])
WITH (METRIC = 'COSINE', TYPE = 'DISKANN');
예제 2
다음 예시는 (음수) dot 곱 메트릭을 사용하여 열에 title_vector 벡터 인덱스를 생성합니다. 병렬성을 8로 제한하고 벡터를 파일 그룹에 SECONDARY 저장합니다.
CREATE VECTOR INDEX vec_idx
ON [dbo].[wikipedia_articles] ([title_vector])
WITH (METRIC = 'DOT', TYPE = 'DISKANN', MAXDOP = 8)
ON [SECONDARY];
예제 3
이 예시는 와 관련된 VECTOR_SEARCH 함수를 사용합니다CREATE VECTOR INDEX. 포함은 조롱됩니다. 실제 시나리오에서는 임베딩 모델과 AI_GENERATE_EMBEDDINGS를 사용해 임베딩을 생성하거나, OpenAI SDK와 같은 외부 라이브러리를 사용하세요.
비고
최신 버전의 벡터 인덱스는 인덱스를 만들기 전에 최소 100행의 데이터가 필요합니다. 이 예제에서는 이 요구 사항을 충족하기 위해 100개의 행을 삽입합니다. 자세한 내용은 최소 데이터 요구 사항을 참조하세요.
다음 코드 블록은 모의 CREATE VECTOR INDEX 포함을 보여 줍니다.
- 미리보기 기능을 활성화하세요(SQL Server 2025에만 필요하며, Azure SQL Database 또는 Fabric의 SQL 데이터베이스에는 필요하지 않음).
- 데이터 형식
dbo.Articles가 있는 열embedding이 있는 샘플 테이블을 만듭니다. - 모의 포함 데이터가 있는 샘플 데이터 행 100개 삽입
- 에서 벡터 인덱스
dbo.Articles.embedding만들기 - 함수를 사용하여 벡터 유사성 검색을 보여 줍니다
VECTOR_SEARCH.
-- Step 0: Enable Preview Feature (SQL Server 2025 only)
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
-- Step 1: Create a sample table with a VECTOR(5) column
CREATE TABLE dbo.Articles
(
id INT PRIMARY KEY,
title NVARCHAR(100),
content NVARCHAR(MAX),
embedding VECTOR(5) -- mocked embeddings
);
GO
-- Step 2: Insert sample data (100 rows required for latest version indexes)
INSERT INTO Articles (id, title, content, embedding)
SELECT
value AS id,
'Article ' || [value],
'Content for article ' || [value],
CAST(JSON_ARRAY(
CAST(value * 0.01 AS FLOAT),
CAST(value * 0.02 AS FLOAT),
CAST(value * 0.03 AS FLOAT),
CAST(value * 0.04 AS FLOAT),
CAST(value * 0.05 AS FLOAT)
) AS VECTOR(5))
FROM GENERATE_SERIES(1, 100);
GO
-- Step 3: Create a vector index on the embedding column
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (METRIC = 'cosine', TYPE = 'diskann');
GO
-- Step 4: Perform a vector similarity search
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3) WITH APPROXIMATE
t.id,
t.title,
t.content,
s.distance
FROM
VECTOR_SEARCH(
TABLE = Articles AS t,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine'
) AS s
ORDER BY s.distance, t.title;
쿼리 구문은 벡터 인덱스 버전에 따라 달라집니다.
| 벡터 인덱스 버전 | 구문 예시 |
|---|---|
| 최신 버전 | 매개 변수 없이 SELECT TOP (N) WITH APPROXIMATE 사용 TOP_N |
| 이전 버전(사용되지 않음) | 함수에서 TOP_N 매개 변수 사용 VECTOR_SEARCH |
이전 버전 인덱스의 경우(사용되지 않는 구문):
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3)
t.id,
t.title,
t.content,
s.distance
FROM
VECTOR_SEARCH(
TABLE = Articles AS t,
COLUMN = embedding,
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 3
) AS s
ORDER BY s.distance, t.title;
예제 4: DML 작업
다음 예시들은 최신 버전을 사용하여 생성된 벡터 인덱스를 가진 테이블에서 DML 연산을 보여줍니다.
여러 행 삭제하기
행을 삭제하면 테이블 및 벡터 검색 결과 모두에서 행이 제거됩니다.
DELETE FROM dbo.wikipedia_articles
WHERE id = 12345;
삭제 작업이 끝나면, 제거된 행은 벡터 검색 쿼리에 더 이상 나타나지 않습니다.
새 행 삽입
포함하는 새 행을 삽입할 수 있으며 인덱스를 다시 작성하지 않고 즉시 검색할 수 있습니다.
INSERT INTO dbo.wikipedia_articles (id, title, title_vector)
VALUES (
99999,
N'Quantum Computing Basics',
AI_GENERATE_EMBEDDINGS(N'Quantum Computing Basics' USE MODEL Ada2Embeddings)
);
새로 삽입된 포함은 자동으로 벡터 인덱스에 통합되며 후속 벡터 검색 쿼리에서 반환할 수 있습니다.
기존 행 업데이트
벡터 또는 비벡터 열 업데이트는 완전히 지원됩니다.
DECLARE @new_embedding VECTOR(1536);
SET @new_embedding = AI_GENERATE_EMBEDDINGS(N'Updated article title' USE MODEL Ada2Embeddings);
UPDATE dbo.wikipedia_articles
SET title_vector = @new_embedding,
title = N'Updated article title'
WHERE id = 50000;
벡터 컬럼을 업데이트하면 인덱스도 그에 맞게 업데이트되어 앞으로 벡터 검색에서 새로운 임베딩을 사용합니다.
복잡한 연산을 위한 사용 MERGE
이 MERGE 문을 사용하면 단일 문에서 삽입, 업데이트 및 삭제 작업을 수행할 수 있습니다.
MERGE INTO dbo.wikipedia_articles AS target
USING (
SELECT
id,
title,
AI_GENERATE_EMBEDDINGS(title USE MODEL Ada2Embeddings) AS title_vector
FROM dbo.staging_articles
) AS source
ON target.id = source.id
WHEN MATCHED THEN
UPDATE SET
title = source.title,
title_vector = source.title_vector
WHEN NOT MATCHED BY TARGET THEN
INSERT (id, title, title_vector)
VALUES (source.id, source.title, source.title_vector)
WHEN NOT MATCHED BY SOURCE AND target.id > 100000 THEN
DELETE;
벡터 인덱스는 문장에 의해 MERGE 이루어진 모든 변경 사항을 반영하도록 자동으로 업데이트됩니다.