열 기반 엔진에서 색인을 캐싱하면 읽기 최적화된 인메모리 색인 표현에서 직접 쿼리를 제공하고 벡터 검색 워크로드에 대해 데이터베이스에서 처리할 수 있는 초당 쿼리 수 (QPS)가 증가합니다.
PostgreSQL 17 이상을 실행하는 AlloyDB Omni 클러스터의 경우 열 기반 엔진에서만 HNSW를 사용할 수 있습니다. 열 기반 엔진이 있는 ScaNN에는 이러한 제한이 없습니다.
시작하기 전에
열 기반 엔진과 색인 캐싱 기능을 사용 설정하려면
google_columnar_engine.enabled및google_columnar_engine.enable_index_caching데이터베이스 플래그를on으로 설정합니다.데이터베이스 플래그를 설정하려면
ALTER SYSTEMPostgreSQL 명령어를 실행합니다.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 hit 및 Columnar 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배까지 메모리가 일시적으로 사용될 수 있습니다.