在資料欄引擎中快取索引,可直接從索引的讀取最佳化記憶體內表示法提供查詢,並提高資料庫可處理的向量搜尋工作負載每秒查詢次數 (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 執行計畫範例
執行計畫會顯示相應索引的「Columnar Engine HNSW Info」部分,其中會顯示從資料欄引擎 (elements_from_ce) 和磁碟 (elements_from_disk) 擷取的元素比例等指標。
以下是查詢的執行計畫範例,該查詢使用已新增至資料欄引擎的 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 索引時,暫時耗用的記憶體最多可達索引大小的兩倍。