在 AlloyDB for PostgreSQL 中調整 ScaNN 索引的最佳做法

在 AlloyDB for PostgreSQL 中調整可擴充的最鄰近項目 (ScaNN) 索引,有助於平衡向量工作負載的搜尋召回率和每秒查詢次數 (QPS)。建議的設定參數和值取決於您使用的是兩層、三層還是四層 ScaNN 索引。

如要瞭解如何建立 ScaNN 索引,請參閱「建立 ScaNN 索引」。

限制

num_leaves 參數可控制索引中的分區數量。分區數量上限如下:

  • PostgreSQL 17 以上版本為 1 億。
  • PostgreSQL 16 以下版本為 3,000 萬。

雙層樹狀結構索引

如要套用最佳化建議,找出資料集的最佳 num_leaves 和 num_leaves_to_search 值,請按照下列建議步驟操作:

  1. 如要建立針對下列情況最佳化的 ScaNN 索引,請將 num_leaves 參數設為下列值,其中 rows 是索引資料表中的資料列數量:
    • 平衡索引建構時間和品質:將 num_leaves 設為 sqrt(rows)。
    • quality:將 num_leaves 設為 rows/100。
  2. 執行測試查詢,提高 scann.num_leaves_to_search (或 scann.pct_leaves_to_search) 的值,直到達到目標檢索範圍 (例如 95%)。如要進一步瞭解如何分析查詢,請參閱「分析查詢」。
  3. 請記下 scann.num_leaves_to_search 和 num_leaves 之間的比例,後續步驟會用到。這個比率可提供資料集的近似值,協助您達到目標喚回度。

    如果您使用的是高維度向量 (500 維度以上),且想提高喚回度,請嘗試調整 scann.pre_reordering_num_neighbors 的值。預設值會設為 50 * K,其中 K 是您在查詢中設定的限制。
  4. 如果查詢達到目標檢索率後,QPS 仍過低,請按照下列步驟操作:
    1. 重新建立索引,並按照下列指引提高 num_leaves 和 scann.num_leaves_to_search 的值:
      • 將 num_leaves 設為資料列數平方根的較大因數。舉例來說,如果索引的 num_leaves 設為資料列數的平方根,請嘗試將其設為平方根的兩倍。如果值已是兩倍,請嘗試將其設為平方根的三倍。
      • 視需要增加 scann.num_leaves_to_search,以維持與 num_leaves 的比例 (您在步驟 3 記下的比例)。
      • 將 num_leaves 設為小於或等於資料列數除以 100 的值。
    2. 再次執行測試查詢。執行測試查詢時,請嘗試降低 scann.num_leaves_to_search,找出可提高 QPS 並維持高喚回度的值。嘗試不同的 scann.num_leaves_to_search 值,不需重建索引。
  5. 重複步驟 4,直到 QPS 和喚回度範圍都達到可接受的值。

三層樹狀結構索引

除了兩層樹狀 ScaNN 索引的建議外,也請參考下列指引。

如要套用建議,找出 num_leaves 和 max_num_levels 索引參數的最佳值,請按照下列步驟操作:

  1. 根據成效目標,使用下列 num_leaves 和 max_num_levels 組合建立 ScaNN 索引:

    • 平衡索引建構時間和品質:將 max_num_levels 設為 2,並將 num_leaves 設為 power(rows, ⅔)。
    • 最佳化品質:將 max_num_levels 設為 2,並將 num_leaves 設為 rows/100。
  2. 執行測試查詢。如要進一步瞭解如何分析查詢,請參閱「分析查詢」。

  3. 請記下 scann.num_leaves_to_search 和 num_leaves 的比例,後續步驟會用到。這個比率可提供資料集的近似值,協助您達到目標喚回度。

如果您使用的是高維度向量 (500 維度以上),且想提高喚回度,請嘗試調整 scann.pre_reordering_num_neighbors 的值。預設值會設為 50 * K,其中 K 是您在查詢中設定的限制。

  1. 如果查詢達到目標喚回度後,QPS 仍過低,請按照下列步驟操作:

    • 請按照下列指引,重新建立索引並提高 num_leaves 和 scann.num_leaves_to_search 的值:
    • 將 num_leaves 設為 power(rows, ⅔) 的較大因數。舉例來說,如果索引的 num_leaves 設為 power(rows, ⅔),請嘗試將其設為 power(rows, ⅔) 的兩倍。如果已是兩倍,請嘗試設為 power(rows, ⅔) 的三倍。
    • 視需要增加 scann.num_leaves_to_search,以維持與 num_leaves 的比例 (在步驟 3 記下的比例)。
    • 將 num_leaves 設為小於或等於 rows/100 的值。
    • 再次執行測試查詢。執行測試查詢時,請嘗試降低 scann.num_leaves_to_search,找出可提高 QPS 並維持高喚回度的值。嘗試不同的 scann.num_leaves_to_search 值,不需重建索引。
  2. 重複步驟 4,直到 QPS 和喚回度範圍都達到可接受的值。

四層樹狀結構索引

除了三層樹狀索引的建議外,請參考下列指引,找出 num_leaves 和 max_num_levels 的最佳值:

  1. 根據成效目標,使用下列 num_leaves 和 max_num_levels 組合建立 ScaNN 索引:

    • 平衡索引建構時間和品質:將 max_num_levels 設為 3,並將 num_leaves 設為 power(ROWS, 3/4)。

    • 最佳化品質:將 max_num_levels 設為 3,並將 num_leaves 設為 ROWS/100。

  2. 執行測試查詢。如要進一步瞭解如何分析查詢,請參閱「分析查詢」。

  3. 請記下 scann.num_leaves_to_search 和 num_leaves 之間的比率。在後續步驟中,您將使用這個比率來達到目標喚回度。

    如果您使用的是高維度向量 (500 維度以上),且想提高喚回度,請嘗試調整 scann.pre_reordering_num_neighbors 的值。

  4. 如果查詢達到目標喚回度後,QPS 仍過低,請重新建立索引,並根據下列指引提高 num_leaves 和 scann.num_leaves_to_search 的值:

    1. 將 num_leaves 設為 power(ROWS, 3/4) 的較大係數。例如,如果索引的 num_leaves 設為 power(ROWS, 3/4),請嘗試將其設為兩倍。如果值已是雙倍,請嘗試設為三倍。

    2. 視需要增加 scann.num_leaves_to_search,維持與 num_leaves 的比例 (在步驟 3 記下的比例)。

    3. 將 num_leaves 設為小於或等於 ROWS/100 的值。

    4. 再次執行測試查詢。執行測試查詢時,請嘗試降低 scann.num_leaves_to_search。找出可提高 QPS,同時維持高喚回度的值。請嘗試不同的 scann.num_leaves_to_search 值,不需重建索引。

  5. 重複步驟四,直到喚回度範圍和 QPS 達到可接受的值。

改善篩選搜尋的召回率

執行 K 近鄰 (KNN) 向量搜尋時,如果包含篩選條件,查詢傳回的結果可能會少於 LIMIT 子句中要求的數量。這可能會導致所謂的「檢索率不足」,在使用高度選擇性的篩選器時,這種情況更容易發生。這是因為 ScaNN 搜尋的初始分區或葉節點,不含足夠符合篩選條件的向量。

為解決這個問題,AlloyDB 提供一項功能,可動態擴充搜尋範圍,超出初始葉節點組合,找出足夠的相符結果。

串流運作方式

只要將 scann.satisfy_limit 參數設為 relaxed_order,即可啟用串流功能。啟用後,向量掃描會繼續搜尋其他葉分區,直到找到足夠的結果來滿足查詢的 LIMIT,進而提高檢索率。

為避免搜尋時間過長,並控制對效能的影響,請使用 scann.max_num_leaves_to_search_pct 參數。這項設定會限制查詢可造訪的葉節點總數百分比上限。預設值為 15%。

串流的使用時機

在下列情況下,建議使用串流功能:

  • 您在向量搜尋中使用了篩選器。
  • 您發現查詢傳回的結果比預期少,這是因為 LIMIT 子句。

如要提高篩選搜尋的召回率,請啟用 scann.satisfy_limit。建議您設定 scann.max_num_leaves_to_search_pct,在叫用率和查詢效能之間取得平衡。

最佳化篩選查詢的效能

為確保篩選查詢發揮最佳效能,建議您在篩選資料欄上建立 B-tree 索引。這樣一來,查詢計畫工具就能選取最有效率的篩選策略,大幅縮短查詢執行時間。

索引維護作業

如果資料表經常更新或插入資料,建議定期重新建立現有 ScaNN 索引,提高檢索準確度。您可以監控索引指標,查看索引建立後的向量分布或向量變動情形,並據此重新建立索引。如要進一步瞭解指標,請參閱「查看向量索引指標」。

後續步驟