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

選取文件版本:

使用可擴充的最鄰近項目 (ScaNN) 或階層式可導覽小世界 (HNSW) 索引時,您可以運用 AlloyDB Omni 資料欄引擎加快向量搜尋速度。資料欄引擎會做為這些向量索引的讀取最佳化記憶體內快取。

在資料欄引擎中快取索引,可直接從索引的讀取最佳化記憶體內表示法提供查詢,並提高資料庫可處理的向量搜尋工作負載每秒查詢次數 (QPS)。

只有在執行 PostgreSQL 17 以上版本的 AlloyDB Omni 叢集,才能搭配使用 HNSW 和資料欄引擎。使用資料欄引擎的 ScaNN 沒有這類限制。

事前準備

  • google_columnar_engine.enabledgoogle_columnar_engine.enable_index_caching 資料庫旗標設為 on,即可啟用資料欄引擎及其索引快取功能。

    修改資料庫叢集資訊清單,將 parameters 屬性新增至 primarySpec 區段:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: CLUSTER_NAME
    spec:
      databaseVersion: "18.1.0"
      primarySpec:
        parameters:
          google_columnar_engine.enabled: "on"
          google_columnar_engine.enable_index_caching: "on"
    

    CLUSTER_NAME 替換為資料庫叢集的名稱。也就是建立資料庫叢集時宣告的名稱。

    如要進一步瞭解如何設定旗標,請參閱「設定資料庫旗標」。

  • 在資料庫中建立 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 索引時,記憶體用量暫時可能會達到索引大小的兩倍。

後續步驟