열 기반 엔진으로 벡터 검색 가속화

문서 버전을 선택합니다.

확장 가능한 최근접 이웃 (ScaNN) 또는 HNSW (Hierarchical Navigable Small World) 색인을 사용하는 경우 AlloyDB Omni 열 기반 엔진을 사용하여 벡터 검색을 가속화할 수 있습니다. 열 기반 엔진은 이러한 벡터 색인의 읽기 최적화된 인메모리 캐시 역할을 합니다.

열 기반 엔진에서 색인을 캐싱하면 읽기 최적화된 인메모리 색인 표현에서 직접 쿼리를 제공하고 벡터 검색 워크로드에 대해 데이터베이스에서 처리할 수 있는 초당 쿼리 수 (QPS)가 증가합니다.

PostgreSQL 17 이상을 실행하는 AlloyDB Omni 클러스터의 경우 열 기반 엔진에서만 HNSW를 사용할 수 있습니다. 열 기반 엔진이 있는 ScaNN에는 이러한 제한이 없습니다.

시작하기 전에

  • 열 기반 엔진과 색인 캐싱 기능을 사용 설정하려면 google_columnar_engine.enabledgoogle_columnar_engine.enable_index_caching 데이터베이스 플래그를 on으로 설정합니다.

    데이터베이스 플래그를 설정하려면 ALTER SYSTEM PostgreSQL 명령어를 실행합니다.

    ALTER SYSTEM SET google_columnar_engine.enabled = 'on';
    ALTER SYSTEM SET google_columnar_engine.enable_index_caching = 'on';
    

    변경사항을 적용하려면 `systemd` 관리자 구성을 다시 로드하고 `alloydbomni` 서비스를 다시 시작합니다. ```posix-terminal sudo systemctl restart alloydbomni18

    플래그 설정에 대한 자세한 내용은 데이터베이스 플래그 구성을 참조하세요.

  • 데이터베이스에서 ScaNN 색인 만들기 또는 HNSW 색인 만들기를 실행합니다.

열 기반 엔진에 색인 추가

열 기반 엔진을 사용 설정한 후 google_columnar_engine_add_index() SQL 함수를 사용하여 기존 색인을 캐시에 추가할 수 있습니다.

열 기반 엔진에 색인을 추가하려면 다음 쿼리를 실행합니다.

SELECT google_columnar_engine_add_index('INDEX_NAME');

INDEX_NAME을 벡터 색인의 이름으로 바꿉니다.

열 기반 엔진에 색인을 추가하면 이 색인을 사용하는 모든 쿼리가 열 기반 엔진에 의해 자동으로 가속화됩니다. 쿼리에서 EXPLAIN (ANALYZE, COLUMNAR_ENGINE) 계획을 사용하여 벡터 쿼리가 열 기반 엔진에 의해 가속화되고 있는지 확인할 수 있습니다.

캐시 사용량 확인

벡터 쿼리가 열 기반 엔진에 의해 가속화되고 있는지 확인하려면 쿼리에서 EXPLAIN (ANALYZE, COLUMNAR_ENGINE) 계획을 사용하면 됩니다.

ScaNN 실행 계획 예시

다음은 열 기반 엔진에 추가된 ScaNN 색인을 사용하는 쿼리의 실행 계획 예시입니다.

EXPLAIN (ANALYZE TRUE, SCANN TRUE, COSTS FALSE, TIMING FALSE, SUMMARY FALSE, VERBOSE FALSE, COLUMNAR_ENGINE TRUE)
SELECT * FROM t ORDER BY val <=> '[0.5,0.5,0.5,0.5]' LIMIT 100;

--This contains details about ScaNN's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
 Index Scan using scann_idx on t t_1 (actual rows=100 loops=1)
      Order By: (val <=> '[0.5,0.5,0.5,0.5]'::vector)
      Limit: 100
      ScaNN Info: (... columnar engine nodes hit=6...)
      Columnar Engine ScaNN Info: (index found=true)
(5 rows)

출력에 columnar engine nodes hitColumnar Engine ScaNN Info: (index found=true)가 있으면 쿼리에 열 기반 엔진이 사용되고 있는 것입니다.

HNSW 실행 계획 예시

실행 계획에는 열 기반 엔진에서 검색된 요소의 비율 (elements_from_ce)과 디스크에서 검색된 요소의 비율(elements_from_disk)과 같은 측정항목을 보여주는 각 색인의 열 기반 엔진 HNSW 정보 섹션이 표시됩니다.

다음은 열 기반 엔진에 추가된 HNSW 색인을 사용하는 쿼리의 실행 계획 예시입니다.

EXPLAIN (ANALYZE, COLUMNAR_ENGINE) SELECT * FROM documents ORDER BY embedding <=> '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector LIMIT 5;

--This contains details about HNSW's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
 Limit (actual rows=5 loops=1)
   ->  Index Scan using hnsw_idx on documents (actual rows=5 loops=1)
         Order By: (embedding '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector)
         Columnar Engine HNSW Info: (index found=true elements_from_ce=385 elements_from_disk=0)
         Columnar Check: table is not in the columnar store
(5 rows)

응답은 모든 요소가 열 기반 엔진에서 검색되었고(elements_from_ce=385) 디스크에서 검색된 요소가 없으므로(elements_from_disk=0) 색인이 열 기반 엔진에 의해 가속화되고 있음을 보여줍니다.

INSERT, UPDATE 또는 DELETE 문과 같은 데이터 수정으로 인해 캐시 항목이 무효화되면 열 기반 엔진은 하이브리드 접근 방식을 사용하여 정확성과 성능을 유지합니다. 유효한 캐시된 벡터를 메모리에서 직접 읽고 수정되거나 새로운 벡터만 디스크에서 가져옵니다.

많은 양의 데이터를 수정하면 캐시가 새로고침될 때까지 elements_from_disk가 일시적으로 증가하고 성능이 저하될 수 있습니다.

캐시된 색인 관리

캐시된 색인의 수명 주기를 관리하려면 선택한 작업의 SQL 명령어를 실행합니다.

  • 캐시를 수동으로 새로고침하려면 다음 명령어를 실행합니다.

    SELECT google_columnar_engine_refresh_index('INDEX_NAME');
    
  • 색인 상태를 확인하려면 다음 명령어를 실행합니다.

    SELECT google_columnar_engine_verify('INDEX_NAME');
    
  • 캐시에서 색인을 삭제하려면 다음 명령어를 실행합니다.

    SELECT google_columnar_engine_drop_index('INDEX_NAME');
    
  • 활성 색인을 보려면 다음 명령어를 실행합니다.

    SELECT * FROM g_columnar_indexes;
    
  • 분할된 색인을 보려면 다음 명령어를 실행합니다.

    SELECT * FROM g_columnar_index_partitions;
    

INDEX_NAME을 색인의 이름으로 바꿉니다.

제한사항

열 기반 엔진 가속화 HNSW 색인을 새로고침하면 색인 크기의 최대 2배까지 메모리가 일시적으로 사용될 수 있습니다.

다음 단계