為確保向量索引能因應可能影響搜尋結果準確度的變化,請維護向量索引。
事前準備
管理索引維護作業前,請先安裝或更新 vector 和 alloydb_scann 擴充功能:
如果未安裝
vector和alloydb_scann擴充功能,請安裝這些擴充功能。CREATE EXTENSION IF NOT EXISTS vector; CREATE EXTENSION IF NOT EXISTS alloydb_scann;如果已安裝
vector和alloydb_scann擴充功能,請更新這些擴充功能。ALTER EXTENSION vector UPDATE; ALTER EXTENSION alloydb_scann UPDATE;
自動維護索引
您可以讓 AlloyDB 自動管理向量索引。隨著資料集成長,AlloyDB 會分析並更新質心,以及分割大型離群值分區。這項功能會自動提升每秒查詢次數 (QPS) 和搜尋結果品質。自動更新會持續生效,直到下次維護作業為止。
AlloyDB 預設會為自動調整的 ScaNN 索引啟用自動索引維護功能。如要建立自動調整的 ScaNN 索引,但停用自動維護功能,請參閱「停用自動索引的自動維護功能」。
如要為手動建立的索引啟用自動維護功能,請參閱「在建立索引時啟用自動維護功能」。
在建立索引時啟用自動維護功能
如要在建立索引時啟用自動維護功能,請將 auto_maintenance 參數設為 on。舉例來說,請參閱下列指令,瞭解如何建立 ScaNN 向量索引。
CREATE INDEX INDEX_NAME ON TABLE_NAME \
USING scann (EMBEDDING_COLUMN_NAME DISTANCE_FUNCTION_NAME) \
WITH (mode='INDEX_MODE', num_leaves=NUM_PARTITIONS, auto_maintenance=on);
請替換下列變數:
INDEX_NAME:要建立的索引名稱,例如,my_scann_index。索引名稱會在資料庫中共用。請確保資料庫中每個資料表的索引名稱都不重複。TABLE_NAME:要新增索引的資料表。EMBEDDING_COLUMN_NAME:儲存要建立索引的vector資料的資料欄。DISTANCE_FUNCTION_NAME: 要用於這個索引的距離函式。選擇下列其中一個選項:L2 距離:
l2點積:
dot_product餘弦距離:
cosine
INDEX_MODE:建立 ScaNN 索引的模式。可用的值如下:AUTO:AlloyDB 會自動管理及調整索引結構。如果mode設為AUTO,則預設auto_maintenance值為on。MANUAL:手動管理及調整 ScaNN 索引。如果mode設為MANUAL,則預設值為off。auto_maintenance
如要進一步瞭解要使用哪種索引模式,請參閱「建立 ScaNN 索引」。
NUM_PARTITIONS:要套用至這個索引的分區數量。請將這個值設為3到1048576之間。如要進一步瞭解如何決定這個值,請參閱「調整ScaNN索引」。
為現有索引設定自動維護
如要為現有的手動索引設定自動維護功能,請執行下列指令:
ALTER INDEX INDEX_NAME SET (auto_maintenance = AUTOMATIC_MAINTENANCE);
請替換下列變數:
INDEX_NAME:要變更的索引名稱。例如:my_scann_index。AUTOMATIC_MAINTENANCE:啟用或停用自動維護功能。如要啟用,請將值設為on。 如要停用,請將值設為off。
提高自動維護總處理量
如要提高自動維護作業的總處理量,請設定
scann.max_background_workers
資料庫旗標。增加背景工作站數量可提高單位時間內處理的索引數量。但不會縮短個別索引的處理時間。這個值必須小於資料庫叢集設定的 max_worker_processes 值。
如要進一步瞭解如何設定資料庫旗標,請參閱「設定執行個體的資料庫旗標」。
延長自動維護延遲時間
如要延長自動維護作業的執行間隔,請設定 scann.maintenance_background_naptime_s 資料庫旗標。
如要進一步瞭解如何設定資料庫旗標,請參閱「設定執行個體的資料庫旗標」。
搜尋分割區百分比
隨著 AlloyDB 自動分割大型離群值分區,分區數量也會增加,因此建議您調整搜尋的葉節點數量,以維持最佳效能。如要自動管理這個號碼,請設定 scann.pct_leaves_to_search 參數。
scann.pct_leaves_to_search 代表要搜尋的目前分區百分比。您可以將這個參數設為 0 到 100 之間的任何值。預設值為 0,這會停用這個參數,並改用 scann.num_leaves_to_search 中設定的值。如果 scann.num_leaves_to_search 也設為 0,則 AlloyDB 預設為 1% 個葉節點。
如果預期資料集會大幅成長,請將初始值設為 1。
如要設定 scann.pct_leaves_to_search,請執行下列指令:
ALTER DATABASE DB_NAME SET scann.pct_leaves_to_search = PERCENTAGE_PARTITIONS_TO_SEARCH;
請替換下列變數:
DB_NAME:資料庫名稱。PERCENTAGE_PARTITIONS_TO_SEARCH:要搜尋的分區百分比。
手動叫用索引維護作業
如要手動叫用特定索引的維護作業,請執行下列指令:
SELECT scann_index_maintenance('INDEX_NAME');
將 INDEX_NAME 替換為要叫用維護作業的索引名稱。例如:my_scann_index。
停用自動索引的自動維護功能
如要停用自動調整的 ScaNN 索引自動維護功能,請在建立索引時將 auto_maintenance 參數設為 OFF。舉例來說,請參閱下列指令,建立自動調整的 ScaNN 索引:
CREATE INDEX similarity_index ON products
USING scann (description_embedding cosine)
WITH (MODE = 'AUTOMATIC', auto_maintenance = 'OFF');
如要停用現有自動調整 ScaNN 索引的自動維護功能,請參閱「為現有索引設定自動維護功能」。
手動重建索引
如果資料表經常更新或插入資料,建議定期重建 ScaNN 索引,以提高召回準確率。如要進一步瞭解如何查看向量分布或突變的變化 (自建立索引以來),請參閱「查看向量索引指標」。
如要使用原始設定手動重建索引,請執行下列指令:
REINDEX INDEX CONCURRENTLY INDEX_NAME;
將 INDEX_NAME 替換為要重建的索引名稱。例如:my_scann_index。
如要進一步瞭解 PostgreSQL 中的重新建立索引作業,請參閱「REINDEX」。