使用資料欄引擎加快向量搜尋速度

選取文件版本:

使用可擴充最鄰近項目 (ScaNN) 或階層式可導覽小世界 (HNSW) 索引時,您可以運用 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 執行計畫範例

執行計畫會顯示相應索引的「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)。

INSERTUPDATEDELETE 等資料修改陳述式使快取項目失效時,資料欄引擎會採用混合式方法,確保準確度和效能。直接從記憶體讀取有效的快取向量,並僅從磁碟擷取修改過或新的向量。

如果修改大量資料,您可能會暫時看到 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 索引時,暫時耗用的記憶體最多可達索引大小的兩倍。

後續步驟