SQL Server 2025: DiskANN 벡터 인덱스와 VECTOR 타입으로 관계형 DB가 RAG 스토어가 되는 방법
왜 관계형 DB에 벡터 검색이 필요한가
RAG(Retrieval-Augmented Generation) 파이프라인의 표준 아키텍처는 두 개의 스토어를 요구한다. 구조화된 메타데이터(사용자, 권한, 문서 속성)는 관계형 DB에, 임베딩 벡터는 Pinecone·Weaviate·pgvector 같은 별도 벡터 DB에 저장한다. 이 분리는 일관성, 트랜잭션, 운영 복잡도 세 가지 문제를 동시에 발생시킨다.
- 일관성: 문서가 삭제되면 관계형 DB와 벡터 DB 양쪽을 동시에 업데이트해야 한다. 하나가 실패하면 불일치가 생긴다.
- 하이브리드 쿼리: "최근 30일 이내, 특정 부서가 작성한 문서 중 의미적으로 가장 가까운 10개"를 찾으려면 두 시스템을 애플리케이션 레이어에서 조인해야 한다.
- 운영: 벡터 DB는 별도 클러스터, 별도 백업 정책, 별도 모니터링이 필요하다.
SQL Server 2025는 이 문제에 대한 답으로 VECTOR 타입과 DiskANN 벡터 인덱스를 도입했다. 2025년 5월 프리뷰가 공개됐고 2025년 11월 RTM이 릴리스됐다. 핵심 타입과 거리 함수는 GA(일반 제공), 근사 최근접 이웃(ANN) 인덱스는 Preview 상태다.
VECTOR 타입 (GA)
CREATE TABLE doc_chunks (
id INT PRIMARY KEY,
doc_id INT NOT NULL,
chunk_text NVARCHAR(MAX),
embedding VECTOR(1536) -- OpenAI text-embedding-3-small
);VECTOR(N) 은 float32 요소 N개로 이뤄진 고정-차원 벡터다. N 범위는 1~1998이다. 내부 저장 형식은 JSON 배열이 아닌 최적화된 바이너리로, 메모리와 I/O를 줄인다. 응용 쿼리에서 노출할 때는 JSON 배열 문자열로 직렬화된다.
-- Python에서 임베딩 삽입 (pyodbc 예시)
embedding_json = json.dumps(embedding_list) # "[0.012, -0.034, ...]"
cursor.execute(
"INSERT INTO doc_chunks (id, doc_id, chunk_text, embedding) VALUES (?, ?, ?, CAST(? AS VECTOR(1536)))",
chunk_id, doc_id, text, embedding_json
)float16 지원은 Preview 상태다. float16을 쓰면 저장 공간을 절반으로 줄일 수 있지만 프로덕션 환경에서는 GA 기능만 사용하는 것이 권장된다.
VECTOR_DISTANCE() 와 전체 스캔 (GA)
VECTOR_DISTANCE(metric, v1, v2) 는 두 벡터 사이의 거리를 계산하는 스칼라 함수다. 지원 메트릭은 세 가지다.
| 메트릭 | 값 | 의미 |
|---|---|---|
'cosine' | 코사인 거리 (= 1 − cosine similarity) | 방향 유사도 |
'euclidean' | L2 유클리드 거리 | 절대 위치 거리 |
'dot' | 음수 내적 | 정규화된 벡터에서 cosine과 동일 |
-- 특정 임베딩에 가장 가까운 청크 10개 (정확한 전체 스캔)
DECLARE @q VECTOR(1536) = CAST(? AS VECTOR(1536));
SELECT TOP 10
c.id,
c.chunk_text,
VECTOR_DISTANCE('cosine', c.embedding, @q) AS dist
FROM doc_chunks c
ORDER BY dist ASC;VECTOR_DISTANCE는 인덱스를 사용하지 않는다. 테이블 전체를 스캔하므로 수백만 행에서는 느리다. GA이지만 ANN 없이는 대규모 사용에 부적합하다.
DiskANN 알고리즘
DiskANN은 Microsoft Research가 2019년 NeurIPS에서 발표한 SSD 친화적 ANN 그래프 알고리즘이다. HNSW(Hierarchical Navigable Small World) 계열의 그래프 기반 ANN과 다른 점은 스토리지 배치 전략에 있다.
HNSW의 문제: 모든 벡터와 그래프 엣지를 DRAM에 올려야 한다. 10억 개의 128-dim float32 벡터는 약 512GB DRAM을 요구한다.
DiskANN의 접근:
- PQ(Product Quantization) 압축 벡터를 DRAM에 보관 — 원본의 1/4 ~ 1/8 크기
- 전체 정밀도 그래프와 벡터는 SSD에 저장
- 검색 시 DRAM의 PQ 벡터로 후보 노드를 빠르게 선별하고, SSD에서 후보 노드의 전체 벡터를 읽어 재정렬
이 구조로 HNSW 대비 10~30배 적은 DRAM으로 동등한 recall을 달성한다. SQL Server 2025의 벡터 인덱스는 이 DiskANN 알고리즘을 사용한다.
벡터 인덱스 생성 (Preview)
-- Preview 기능 활성화 (데이터베이스 범위)
ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = 1;
-- DiskANN 벡터 인덱스 생성
CREATE VECTOR INDEX emb_idx
ON doc_chunks (embedding)
WITH (
metric = 'cosine', -- cosine | euclidean | dot
type = 'diskann'
);PREVIEW_FEATURES = 1 없이 CREATE VECTOR INDEX를 실행하면 오류가 발생한다. 이 설정은 데이터베이스 범위이므로 동일 인스턴스의 다른 데이터베이스에는 영향을 주지 않는다.
인덱스 빌드는 비동기로 진행된다. 빌드 중에도 VECTOR_DISTANCE 전체 스캔은 계속 사용할 수 있다.
VECTOR_SEARCH() (Preview)
DECLARE @q VECTOR(1536) = CAST(? AS VECTOR(1536));
SELECT v.id, v.chunk_text, v.dist
FROM VECTOR_SEARCH(
TABLE doc_chunks AS c, -- 대상 테이블
COLUMN embedding, -- 벡터 열
SIMILAR_TO @q, -- 쿼리 벡터
METRIC 'cosine', -- 거리 메트릭
TOP_N 50 -- DiskANN 후보 수
) AS v
ORDER BY v.dist ASC;VECTOR_SEARCH는 테이블 값 함수(TVF)로 DiskANN 인덱스를 사용한다. 반환 컬럼은 id, 원본 테이블의 모든 컬럼, 그리고 dist다.
TOP_N은 DiskANN이 반환하는 후보 수다. 최종 애플리케이션에 전달하는 결과보다 크게 설정해야 recall이 올라간다. 통상적으로 최종 결과의 3~5배를 권장한다.
하이브리드 검색: 메타데이터 필터 + ANN
VECTOR_SEARCH는 일반 T-SQL과 조인할 수 있다. 벡터 유사도와 관계형 필터를 한 쿼리에 쓸 수 있다.
DECLARE @q VECTOR(1536) = CAST(? AS VECTOR(1536));
DECLARE @uid INT = ?; -- 요청 사용자 ID
-- 사용자가 접근할 수 있는 문서의 청크 중 의미적으로 가장 가까운 10개
SELECT TOP 10
d.title,
c.chunk_text,
v.dist
FROM VECTOR_SEARCH(
TABLE doc_chunks AS c,
COLUMN embedding,
SIMILAR_TO @q,
METRIC 'cosine',
TOP_N 100 -- 넉넉히 뽑은 뒤 아래에서 조인 필터
) AS v
JOIN doc_chunks c ON c.id = v.id
JOIN documents d ON d.id = c.doc_id
JOIN doc_access da ON da.doc_id = d.id AND da.user_id = @uid
WHERE d.created_at >= DATEADD(DAY, -90, GETDATE())
ORDER BY v.dist ASC;이 패턴에서 DiskANN은 TOP_N=100개 후보를 반환하고, 이후 조인과 WHERE가 행-레벨 필터를 적용한다. 필터 선택도가 높으면 최종 결과가 10개 미만일 수 있으므로 TOP_N을 여유 있게 설정해야 한다.
SQL Server 2025 벡터 아키텍처
ODBC / JDBC / SqlClient
embedding_json → VECTOR(N) CAST
Azure OpenAI / 로컬 모델
float32 배열 생성
DiskANN 인덱스 탐색
TOP_N 후보 반환
메타데이터 필터
권한·날짜·카테고리
인덱스 없는 정확 검색
소규모 테이블 전용
원본의 1/4~1/8 크기
빠른 후보 선별
전체 정밀도 벡터
그래프 엣지 저장
최적화된 바이너리
float32, 1~1998 dims
rank + chunk_text
LLM 프롬프트 조립
트랜잭션 일관성 보장
단일 DB 운영
GA vs Preview 경계
| 기능 | 상태 | 비고 |
|---|---|---|
VECTOR(N) 데이터 타입 | GA | float32, N=1~1998 |
VECTOR_DISTANCE() | GA | 전체 스캔, 3가지 메트릭 |
CREATE VECTOR INDEX (DiskANN) | Preview | PREVIEW_FEATURES=1 필요 |
VECTOR_SEARCH() | Preview | DiskANN 인덱스 필요 |
| float16 VECTOR | Preview | — |
| Azure SQL Database 지원 | Preview | SQL Server 2025 RTM 기준 |
Preview 기능은 SLA, 데이터 손실 없는 업그레이드 경로, Microsoft 지원 범위가 GA와 다르다. 프로덕션에서 Preview 기능을 사용하려면 Microsoft와 사전 협의가 필요하다.
pgvector와의 비교
SQL Server 2025 이전부터 관계형 DB에 벡터를 통합하는 대표 사례는 PostgreSQL + pgvector였다. 두 접근의 차이점을 정리하면 다음과 같다.
| 항목 | pgvector (PostgreSQL) | SQL Server 2025 |
|---|---|---|
| ANN 알고리즘 | HNSW, IVFFlat | DiskANN |
| DRAM 요구량 | 높음 (그래프 인메모리) | 낮음 (PQ 압축) |
| 최대 차원 | 2000 (HNSW), 무제한(IVFFlat) | 1998 |
| 라이선스 | PostgreSQL License | SQL Server 라이선스 |
| ANN 인덱스 상태 | GA | Preview |
| 운영 환경 | Linux/Windows | Windows/Linux (SQL Server) |
DiskANN의 핵심 장점은 DRAM 효율이다. 고차원 대규모 벡터(수억 개 이상)를 다룰 때 HNSW보다 현실적인 하드웨어 비용에서 운영할 수 있다.
마이그레이션 체크리스트
기존에 별도 벡터 DB(Pinecone, Weaviate 등)를 운영 중이라면 SQL Server 2025로 통합을 검토할 때 다음을 확인한다.
- 차원 수 확인: 현재 임베딩 모델의 출력 차원이 1998 이하인지 확인한다. OpenAI text-embedding-3-small은 1536, text-embedding-3-large는 3072이다. 3072-dim은 지원 범위를 벗어난다.
- PREVIEW_FEATURES 정책 결정: 조직의 Preview 기능 사용 정책을 먼저 확인한다. GA만 쓰면 ANN 없이
VECTOR_DISTANCE전체 스캔만 가능하다. - 인덱스 빌드 시간 계획: DiskANN 인덱스는 초기 빌드에 수십 분이 걸릴 수 있다. 마이그레이션 다운타임 계획에 반영한다.
- TOP_N 튜닝:
VECTOR_SEARCH의TOP_N을 최종 결과 수의 3~5배로 설정하고, 실제 recall을 측정해 조정한다. - float32 vs float16: 저장 공간을 줄이려면 float16을 검토하되, Preview 상태임을 감안한다.