ScaNN
索引的建議參數會因您選擇建立兩層或三層樹狀結構索引而異。本頁提供建議,說明如何調整 PostgreSQL 適用的 AlloyDB 索引參數,在召回率和每秒查詢次數之間取得最佳平衡。
建立 ScaNN 索引
詳情請參閱 ScaNN 索引參考資料。
兩層樹狀結構索引
如要套用建議,協助您找出資料集的最佳 num_leaves
和 num_leaves_to_search
值,請按照下列建議步驟操作:
- 如要建立針對下列情況最佳化的
ScaNN
索引,請將num_leaves
參數設為下列值,其中 rows 是索引資料表中的資料列數:- 兼顧索引建構時間和品質:將
num_leaves
設為sqrt(rows)
。 - 品質:將 num_leaves 設為 rows/100。
- 兼顧索引建構時間和品質:將
- 執行測試查詢,並提高
scann.num_of_leaves_to_search
的值,直到達到目標召回率範圍 (例如 95%) 為止。如要進一步瞭解如何分析查詢,請參閱「分析查詢」。 - 請記下
scann.num_leaves_to_search
和num_leaves
之間的比例,後續步驟會用到。這個比率會提供資料集的近似值,協助您達成目標召回率。
如果您使用高維度向量 (500 個維度以上),且想提高召回率,請嘗試調整scann.pre_reordering_num_neighbors
的值。預設值會設為500 * K
值,其中K
是您在查詢中設定的限制。 - 如果查詢達到目標召回率後,QPS 仍過低,請按照下列步驟操作:
- 重新建立索引,並根據下列指引增加
num_leaves
和scann.num_leaves_to_search
的值:- 將
num_leaves
設為大於列數平方根的因數。舉例來說,如果索引的num_leaves
設為資料列數的平方根,請嘗試將其設為平方根的兩倍。如果值已是兩倍,請嘗試將值設為平方根的三倍。 - 視需要增加
scann.num_leaves_to_search
,以維持與num_leaves
的比例 (您在步驟 3 中記下)。 - 將
num_leaves
設為小於或等於資料列數除以 100 的值。
- 將
- 再次執行測試查詢。
執行測試查詢時,請嘗試降低
scann.num_leaves_to_search
,找出可提高每秒查詢次數,同時維持高召回率的值。嘗試使用不同的scann.num_leaves_to_search
值,不必重建索引。
- 重新建立索引,並根據下列指引增加
- 重複步驟 4,直到 QPS 和召回範圍都達到可接受的值。
三層樹狀結構索引
除了兩層樹狀結構 ScaNN
索引的建議外,請使用下列指引。
如要套用建議,找出 num_leaves
和 max_num_levels
索引參數的最佳值,請按照下列步驟操作:
根據成效目標,使用下列
num_leaves
和max_num_levels
組合建立ScaNN
索引:- 平衡索引建構時間和品質:將
max_num_levels
設為2
,並將num_leaves
設為power(rows, ⅔)
。 - 最佳化品質:將
max_num_levels
設為2
,並將num_leaves
設為rows/100
。
- 平衡索引建構時間和品質:將
執行測試查詢。如要進一步瞭解如何分析查詢,請參閱「分析查詢」。
請記下
scann.num_leaves_to_search
和num_leaves
之間的比例,後續步驟會用到。這個比率會提供資料集的近似值,有助於您達成目標召回率。
如果您處理的是高維度向量 (500 個維度以上),且想提高召回率,請嘗試調整 scann.pre_reordering_num_neighbors
的值。預設值會設為 500 * K
值,其中 K
是您在查詢中設定的限制。
如果查詢達到目標召回率後,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
,找出可提高每秒查詢次數,同時維持高召回率的值。嘗試使用不同的scann.num_leaves_to_search
值,不必重建索引。
- 重新建立索引,並根據下列指引增加
重複步驟 4,直到 QPS 和召回範圍都達到可接受的值。
改善篩選搜尋的召回率
執行包含篩選條件的 K 近鄰 (KNN) 向量搜尋時,查詢傳回的結果可能少於 LIMIT
子句中要求的數量。這可能會導致所謂的召回率不足,如果使用高度選擇性的篩選器,就更有可能發生這種情況。這是因為 ScaNN 搜尋的初始分區或葉節點,不含足夠的向量來滿足篩選條件。
為解決這個問題,AlloyDB 提供一項功能,可讓搜尋作業動態擴充初始葉節點集,以找出足夠的相符結果。
串流的運作方式
如要啟用串流功能,請將 scann.satisfy_limit
參數設為 relaxed_order
。啟用後,向量掃描會繼續搜尋其他葉節點分割區,直到找到足夠的結果來滿足查詢的 LIMIT
,進而提升召回率。
如要避免搜尋時間過長,並控制對效能的影響,可以使用 scann.max_pct_leaves_to_search
參數。這項設定會為查詢可造訪的葉節點總百分比設定上限,做為安全措施。預設值為 15%
。
使用串流的時機
以下情況適合使用串流功能:
- 您在向量搜尋中使用篩選器。
- 您發現查詢傳回的結果數量比預期少,這是根據
LIMIT
子句而定。
啟用 scann.satisfy_limit
後,篩選後的搜尋結果召回率會有所提升。建議您也設定 scann.max_pct_leaves_to_search
,在召回率和查詢效能之間取得平衡。
索引維護作業
如果表格經常更新或插入資料,建議您定期重新為現有 ScaNN
索引建立索引,以提高召回準確度。
您可以監控索引指標,查看索引建構後向量分布或向量突變的變化,然後據此重新建立索引。如要進一步瞭解指標,請參閱「查看向量索引指標」。