使用可擴充最鄰近項目 (ScaNN) 或階層式可導覽小世界 (HNSW) 索引時,您可以運用 AlloyDB for PostgreSQL 資料欄引擎,加快向量搜尋速度。資料欄引擎會做為這些向量索引的讀取最佳化記憶體內快取。
在資料欄引擎中快取索引,可直接從索引的讀取最佳化記憶體內表示法提供查詢,並提高資料庫可處理的每秒查詢次數 (QPS),以因應向量搜尋工作負載。
您只能搭配 AlloyDB 叢集 (執行 PostgreSQL 17 以上版本) 的資料欄引擎使用 HNSW。使用資料欄引擎的 ScaNN 沒有這類限制。
事前準備
將
google_columnar_engine.enabled和google_columnar_engine.enable_index_caching資料庫旗標設為on,即可啟用資料欄引擎及其索引快取功能。gcloud alloydb instances update INSTANCE_ID \ --database-flags google_columnar_engine.enabled=on,google_columnar_engine.enable_index_caching=on \ --region=REGION \ --cluster=CLUSTER_ID \ --project=PROJECT_ID更改下列內容:
INSTANCE_ID:要啟用資料欄引擎的執行個體 ID。REGION:執行個體所在的區域,例如us-central1。CLUSTER_ID:執行個體所在的叢集 ID。PROJECT_ID:叢集所在的專案 ID。
如要進一步瞭解如何設定旗標,請參閱「設定資料庫旗標」。
在資料庫中建立 ScaNN 索引或建立 HNSW 索引。
將索引新增至資料欄引擎
啟用資料欄引擎後,您可以使用 google_columnar_engine_add_index() SQL 函式,將現有索引新增至快取。
如要將索引新增至資料欄引擎,請按照下列步驟操作:
前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。
如要顯示叢集「總覽」頁面,請按一下「資源名稱」欄中的 AlloyDB 叢集名稱。
在導覽窗格中,按一下「AlloyDB Studio」。
使用資料庫名稱、使用者名稱和密碼登入 AlloyDB Studio。
在「Editor 1」(編輯器 1) 分頁中,輸入下列查詢:
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 增加,效能也會下降,直到快取重新整理為止。
管理快取索引
如要管理快取索引的生命週期,請按照下列步驟操作:
前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。
如要顯示叢集「總覽」頁面,請按一下「資源名稱」欄中的 AlloyDB 叢集名稱。
在導覽窗格中,按一下「AlloyDB Studio」。
使用資料庫名稱、使用者名稱和密碼登入 AlloyDB Studio。
在「編輯器 1」分頁中,輸入所選工作的 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 索引時,暫時耗用的記憶體最多可達索引大小的兩倍。