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

문서 버전을 선택합니다.

확장 가능한 최근접 이웃 (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';
    

    구성 파라미터 변경사항을 적용하려면 실행 중인 AlloyDB Omni 컨테이너를 다시 시작해야 합니다.

    Docker

      sudo docker restart CONTAINER_NAME
      ```
    * { Podman }
    ```posix-terminal
      sudo podman restart CONTAINER_NAME
      ```
    
    
    

    For more information on setting flags, see Configure database flags.

  • Create a ScaNN index or Create an HNSW index in your database.

Add an index to the columnar engine

After enabling the columnar engine, you can add an existing index to the cache using the google_columnar_engine_add_index() SQL function.

To add an index to the columnar engine, run the following query:

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)에서 가져온 요소의 비율과 같은 측정항목을 보여주는 해당 색인의 Columnar Engine HNSW Info 섹션이 표시됩니다.

다음은 열 기반 엔진에 추가된 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배에 달하는 메모리가 사용될 수 있습니다.

다음 단계