維護向量索引

本頁說明維護向量索引的選項。維護索引有助於確保索引能因應資料變更,避免影響搜尋結果的準確度。隨著資料集擴大,查詢效能可能會降低,請參考本頁的策略,避免發生這種情況。

事前準備

  • 安裝或更新 vectoralloydb_scann 擴充功能。

    1. 如果未安裝 vectoralloydb_scann 擴充功能,請安裝最新版本的擴充功能。

      CREATE EXTENSION IF NOT EXISTS vector;
      CREATE EXTENSION IF NOT EXISTS alloydb_scann;
      
    2. 如果已安裝 vectoralloydb_scann 擴充功能,請將擴充功能升級至最新版本。

      ALTER EXTENSION vector UPDATE;
      ALTER EXTENSION alloydb_scann UPDATE;
      

查看向量索引指標

如果資料表經常更新或插入資料,建議您定期重新建立現有 ScaNN 索引,以提高索引的召回準確率。您可以監控索引指標,查看索引建構完成後向量分布或突變的變化,然後視需要重新建立索引。

如要進一步瞭解指標,請參閱「查看向量索引指標」。

自動維護索引

有了自動索引維護功能,AlloyDB 就能逐步管理索引,因此隨著資料集成長,AlloyDB 會持續分析及更新質心,並分割大型離群值分割區。這有助於維持每秒可比較查詢的索引 (QPS) 和搜尋結果品質。自動維護所做的任何更新都會永久生效,直到下次維護作業執行為止。

建立 ScaNN 索引時,您可以使用 scann.enable_preview_features 資料庫標記 (GUC) 和索引層級的 auto_maintenance 參數,啟用 ScaNN 索引的自動索引維護功能。

系統預設會為自動調整的 ScaNN 索引啟用自動索引維護功能。如果是手動建立的索引,啟用 scann.enable_preview_features 標記後,您可以在建立索引時設定 auto_maintenance 參數,或使用 scann_index_maintenance 函式,視需要觸發自動索引維護作業。

如要啟用 AlloyDB 自動維護索引功能,請啟用 scann.enable_preview_features 標記:

gcloud alloydb instances update INSTANCE_ID \
     --database-flags scann.enable_preview_features=on \
     --region=REGION_ID \
     --cluster=CLUSTER_ID \
     --project=PROJECT_ID

更改下列內容:

  • INSTANCE_ID:執行個體的 ID。
  • REGION_ID:執行個體所在區域,例如 us-central1
  • CLUSTER_ID:執行個體所在的叢集 ID。
  • PROJECT_ID:叢集所在的專案 ID。

自動維護作業對索引所做的任何更新都是永久性的,直到 AlloyDB 再次更新索引為止。

在建立索引時啟用自動維護功能

如要建立手動 ScaNN 索引並啟用自動索引維護功能,請執行下列範例指令:

CREATE INDEX INDEX_NAME ON TABLE \
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION) \
WITH (mode=MANUAL, num_leaves=NUM_LEAVES_VALUE, auto_maintenance=on);

更改下列內容:

  • INDEX_NAME:要建立的索引名稱,例如 my-scann-index。索引名稱會在資料庫中共用。請確保資料庫中每個資料表的索引名稱都不重複。

  • TABLE:要新增索引的資料表。

  • EMBEDDING_COLUMN:儲存 vector 資料的資料欄。

  • DISTANCE_FUNCTION:要用於這個索引的距離函式。選擇下列其中一個選項:

    • L2 距離: l2

    • 點積: dot_product

    • 餘弦距離: cosine

  • NUM_LEAVES_VALUE:要套用至這個索引的分區數量。請設為 1 到 1048576 之間的任何值。如要進一步瞭解如何決定這個值,請參閱「調整 ScaNN 索引」。

您可以設定 scann.max_background_workers 資料庫旗標,提高多個索引的自動索引維護作業輸送量。增加工作站數量可提高單位時間內處理的索引數量,但不會縮短單一索引的處理時間。您也可以視需要設定資料庫標記 scann.maintenance_background_naptime_s,控管自動執行索引維護作業的最短間隔時間。

設定 pct_leaves_to_search,自動維護索引

如果您已啟用自動索引維護功能,AlloyDB 會根據啟發式方法自動分割資料分割,例如分割超過特定大小的大型離群資料分割。由於這些分割作業會增加分割區數量,因此您應調整要搜尋的葉節點數量,以維持最佳效能。

如要管理自動搜尋的葉節點數量,請使用 pct_leaves_to_search。這個參數可讓您指定要搜尋的分區數量百分比。如果預期資料集會大幅成長,請先將 pct_leaves_to_search 值設為 1。這個參數預設為停用。

將這個值設為目前分區數量的百分比。舉例來說,如要搜尋目前分區數量的 1%,請將這個值設為 1

您可以將這個參數設為 0100 之間的任何值。預設值為 0,這會停用這個參數,並使用 scann.num_leaves_to_search 計算要搜尋的葉節點數量。

如要在資料庫上設定 pct_leaves_to_search 旗標,請執行下列指令:

ALTER DATABASE DATABASE_NAME SET scann.pct_leaves_to_search = PERCENTAGE_LEAVES_TO_SEARCH;

更改下列內容:

  • DATABASE_NAME:資料庫名稱。
  • PERCENTAGE_LEAVES_TO_SEARCH:要搜尋的 num_leaves 百分比。

手動叫用索引維護作業

如要對特定索引隨選叫用維護作業,請執行下列指令。這項功能適用於 alloydb_scann 版本 0.1.2 以上。

如要使用這項函式,請先啟用 scann.enable_preview_features 旗標,詳情請參閱「自動維護索引」。

SELECT scann_index_maintenance('INDEX_NAME');

手動重建索引

如要使用建立索引時指定的設定重建索引,可以手動重建索引。

如要手動重建索引,請執行下列指令:

REINDEX INDEX CONCURRENTLY INDEX_NAME;

INDEX_NAME 替換為要重建的索引名稱,例如 my-scann-index。索引名稱會在資料庫中共用。請確保資料庫中每個資料表的索引名稱都不重複。

如要進一步瞭解 PostgreSQL 中的重新建立索引作業,請參閱「REINDEX」。

後續步驟