벡터 검색 권장사항

이 문서에서는 Spanner의 벡터 검색 성능을 최적화하기 위한 권장사항을 제공합니다.

Spanner 기본사항 이해하기

효과적인 Spanner 벡터 검색 성능 테스트를 수행하려면 Spanner 기본사항을 이해해야 합니다. 예를 들어 동일한 쿼리를 즉시 다시 실행하면 캐시로 인해 더 빠를 수 있습니다. 주로 따뜻한 데이터를 사용하는 애플리케이션의 성능을 테스트하려면 먼저 워밍업 읽기를 실행하세요.

다음 가이드를 참고하세요.

Spanner는 데이터베이스 분할을 기반으로 쿼리를 병렬로 처리합니다. 지속적인 프로덕션 쿼리 부하로 테스트하면 부하 기반 분할을 사용할 수 있으며, 이를 통해 병렬 처리가 증가하여 쿼리 성능이 향상됩니다. 향후 로드의 병렬 처리를 늘리려면 특히 KNN의 경우 데이터베이스를 사전 분할하는 것이 좋습니다.

벡터 검색 권장사항

이 문서에서는 다음과 같은 벡터 검색 권장사항을 설명합니다.

임베딩 열에 주석 달기

vector_length로 삽입 열에 주석을 답니다. 이 주석은 K-근접 이웃 (KNN) 검색의 성능 최적화를 지원하며 근사 최근접 이웃 (ANN) 검색의 필수 요건입니다.

상위 k 쿼리 사용

최근접 이웃을 찾으려면 LIMIT와 함께 ORDER BY 절을 사용하세요. 상위 k 쿼리는 벡터 검색에 매우 최적화되어 있습니다. WHERE 절에서 거리 기준점을 기준으로 필터링하지 마세요.

예를 들어 다음은 권장되지 않습니다.

SELECT d.DocId
FROM Documents AS d
WHERE COSINE_DISTANCE(d.DocEmbedding, @vector) < 1;

대신 다음을 사용하세요.

SELECT d.DocId
FROM Documents AS d
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;

상위 k 쿼리를 사용하면 거리 임곗값 조정이 필요 없으므로 더 간단할 뿐만 아니라 벡터 검색에 특화된 성능 최적화도 가능합니다.

LIMIT 절에 SQL 리터럴 사용

상위 k 제한이 고정된 경우 매개변수 대신 SQL 리터럴을 사용하세요. 예를 들어 LIMIT @limit 대신 LIMIT 10를 사용합니다. 이렇게 하면 Spanner 쿼리 최적화 도구가 최적의 쿼리 실행 계획을 선택하는 데 필요한 정보가 더 많이 제공됩니다.

일괄 중심 스캔 사용

벡터 검색 쿼리는 스캔이 많이 필요합니다. KNN 쿼리의 경우 scan_method=batch 쿼리 힌트를 사용하여 일괄 지향 스캔을 사용하는 것이 좋습니다. ANN 쿼리의 기본 스캔 방법입니다.

소규모 데이터 세트에는 KNN 사용

지연 시간 예산에 KNN이 충분하다면 벡터 색인을 만들지 마세요. KNN은 더 정확하고 색인 생성 및 유지관리 비용이 들지 않으며 필터링 후 입력 행 수가 적은 경우 ANN보다 성능이 더 우수할 수 있습니다.

보조 색인으로 필터링된 KNN 가속화

필터링된 KNN 쿼리의 성능을 개선하려면 필터링 열에 보조 색인을 만드세요. 예를 들어, 다음 쿼리를 살펴보겠습니다.

SELECT d.DocId
FROM Documents AS d
WHERE Category = 'toy'
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;

카테고리별 문서 수가 수만 개 미만이고 애플리케이션에서 100ms의 쿼리 지연 시간을 허용할 수 있는 경우 Category 열에 보조 색인을 만듭니다. 색인에 DocEmbedding 열을 저장합니다.

CREATE INDEX ON Documents(Category) STORING (DocEmbedding);

이 색인 생성은 필터링된 쿼리를 가속화하는 데 도움이 됩니다.

대규모 데이터 세트에 ANN 사용

필터를 평가한 후 행 수가 많은 경우 벡터 색인을 만들고 ANN 검색을 사용합니다. 다음과 같은 여러 기술을 사용하면 ANN으로 필터링을 가속화할 수 있습니다.

  • 필터링 열 저장: 벡터 검색을 순회하는 동안 필터링을 사용 설정하려면 벡터 색인에 필터링 열을 저장합니다. 이를 통해 실행 초기에 부적격 행을 삭제할 수 있습니다.

    CREATE VECTOR INDEX ON Documents(DocEmbedding) STORING(Category);
    
  • 주요 필터링 열: 많은 결과를 삭제하는 선택성이 높은 열의 필터링 속도를 높이려면 이러한 열을 벡터 색인의 추가 주요 열로 구성합니다. 이러한 추가 키에 대해 정확한 동일성 (= 연산자 사용)을 지정하는 쿼리가 가장 빠르게 실행됩니다. 이러한 추가 키에 IN 절을 사용해도 동일한 수준의 가속이 달성되지 않습니다.

    CREATE VECTOR INDEX ON Documents(DocEmbedding, Category);
    
  • 큰 열을 저장하거나 키로 사용하지 않기: 이렇게 하면 임베딩을 위한 데이터 블록이 희석되어 읽기 효율성이 저하될 수 있습니다. 또는 색인에 해시 열을 사용하고 상위 k개 이후에 원래 큰 열을 사후 필터로 사용하는 것이 좋습니다.

  • 필터링된(부분) 벡터 색인 만들기: 데이터 세트의 하위 집합만 쿼리하고 필터링 조건(예: Category = "Tech")이 해당 하위 집합을 정의하는 경우 필터링된 또는 부분 벡터 색인을 만듭니다.