維護向量索引

為確保向量索引能因應可能影響搜尋結果準確度的變化,請維護向量索引。

事前準備

管理索引維護作業前,請先安裝或更新 vectoralloydb_scann 擴充功能:

  • 如果未安裝 vectoralloydb_scann 擴充功能,請安裝這些擴充功能。

    CREATE EXTENSION IF NOT EXISTS vector;
    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    
  • 如果已安裝 vectoralloydb_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,則預設值為 offauto_maintenance

    如要進一步瞭解要使用哪種索引模式,請參閱「建立 ScaNN 索引」。

  • NUM_PARTITIONS:要套用至這個索引的分區數量。請將這個值設為 31048576 之間。如要進一步瞭解如何決定這個值,請參閱「調整 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 代表要搜尋的目前分區百分比。您可以將這個參數設為 0100 之間的任何值。預設值為 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」。

後續步驟