在 AlloyDB for PostgreSQL 中維護可擴充的最鄰近項目 (ScaNN) 向量索引,有助於在資料表資料隨時間變更時,維持搜尋召回率和查詢效能。您可以監控索引分布指標,偵測資料偏移,並透過自動索引維護或手動重建,維持向量索引平衡。
事前準備
管理索引維護作業前,請先安裝或更新 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時,預設auto_maintenance值為off。
如要進一步瞭解應使用哪種索引模式,請參閱「建立 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。