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

選取文件版本:

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

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

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

事前準備

  • 將 google_columnar_engine.enabled 和 google_columnar_engine.enable_index_caching 資料庫旗標設為 on,啟用資料欄引擎和索引快取功能。

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

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: CLUSTER_NAME
    spec:
      databaseVersion: "18.4.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 hit 和 Columnar Engine ScaNN Info: (index found=true),表示查詢使用了資料欄引擎。

HNSW 執行計畫範例

執行計畫會顯示各個索引的「Columnar Engine HNSW Info」(資料欄引擎 HNSW 資訊) 區段,其中包含從資料欄引擎 (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 索引時,暫時耗用的記憶體最多可達索引大小的兩倍。

後續步驟