本頁說明向量索引的最佳做法,可最佳化向量索引,並改善近似最鄰近 (ANN) 查詢結果。
調整向量搜尋選項
如果您未指定任何向量索引選項,Spanner 會嘗試自動選擇最佳化選項。進階使用者如要為特定工作負載調整向量索引選項,可以建立新的向量索引,並在 CREATE VECTOR INDEX 陳述式中設定和調整這些值。index_option_list向量索引選項的最佳值取決於用途、向量資料集和查詢向量。您可能需要進行反覆調整,找出最適合特定工作負載的值。
選取適當值時,請遵循下列實用準則:
tree_depth(樹狀結構層級):如果建立索引的資料表少於 1 千萬列,請使用tree_depth值2。否則,tree_depth的3支援的資料表最多約有 100 億列。如未指定,Spanner 會自動判斷tree_depth的值。num_leaves:建議每個葉片指定 200 到 1000 列。num_leaves值越大,向量索引建構時間就越長,但可降低特定目標召回率的查詢費用。不過,如果num_leaves的值過大,可能會因為搜尋許多非常小的葉子叢集而產生相關的額外負荷,導致查詢費用再次增加。如未指定,Spanner 會自動判斷num_leaves的值。num_branches:只有在tree_depth為 3 時,才適用這個選項。建議每個分支的目標葉片數為 50 至 500 片,且num_branches應小於num_leaves。num_branches值越大,向量索引建構時間越長,但可降低特定目標召回率的查詢費用。不過,如果num_branches值過大,可能會導致查詢成本再次增加,因為搜尋許多非常小的葉子叢集會產生相關的額外負荷。如未指定,Spanner 會自動判斷num_branches的值。num_leaves_to_search:這個選項會指定要搜尋的索引分葉節點數量。增加num_leaves_to_search可提高召回率,但也會增加延遲時間和費用。建議您使用CREATE VECTOR INDEX陳述式中定義的葉節點總數的 1% 做為num_leaves_to_search的值。如果您使用篩選子句,請增加這個值來擴大搜尋範圍。
如果已達到可接受的召回率,但查詢費用過高,導致最高每秒查詢次數偏低,請按照下列步驟增加 num_leaves:
- 將
num_leaves設為原始值的某個倍數k(例如2 * (table_row_count / 1000))。 - 將
num_leaves_to_search設為原始值的相同倍數 k。 - 實驗減少
num_leaves_to_search,以改善費用和每秒查詢次數,同時維持召回率。
判斷向量搜尋選項值
如要判斷 Spanner 用於向量索引的 tree_depth、num_leaves 和 num_branches 參數,請查詢 INFORMATION_SCHEMA.INDEX_OPTIONS 檢視區塊。參數值可能與您在建立索引時明確指定的值略有不同,因為 Spanner 有時會調整這些值,以更符合您的資料。如未指定這些參數,INFORMATION_SCHEMA.INDEX_OPTIONS 檢視畫面會顯示 Spanner 選擇的值。
執行這項查詢,即可顯示參數值:
SELECT
opt.option_name,
opt.option_type,
opt.option_value
FROM
INFORMATION_SCHEMA.INDEX_OPTIONS AS opt
WHERE
opt.index_name = @vector_index_name;
查詢會傳回包含 option_name 的資料列:system_optimized_tree_depth、system_optimized_num_leaves 和 system_optimized_num_branches,這些資料列會反映索引使用的參數。
提升召回率
如要提高召回率,請考慮調整 num_leaves_to_search 值或重建向量索引。
調高 num_leaves_to_search 值
如果 num_leaves_to_search 值太小,您可能會發現某些查詢向量較難找到最近鄰。建立新的向量索引並提高 num_leaves_to_search 值,有助於搜尋更多葉節點,進而提升召回率。最近的查詢可能包含更多這類難以處理的向量。
重建向量索引
向量索引的樹狀結構會在建立時針對資料集進行最佳化,之後會維持不變。因此,如果在建立初始向量索引後加入顯著不同的向量,樹狀結構可能會不夠理想,導致召回率較差。
如要在不停機的情況下重建向量索引,請按照下列步驟操作:
- 在與目前向量索引相同的嵌入資料欄上建立新向量索引,並視需要更新參數 (例如
OPTIONS)。建立索引完成後,您可以評估兩個索引中哪個成效較佳。如果是,請繼續下一個步驟。 否則,請繼續刪除過時的向量索引。 Spanner 會在執行查詢時自動決定要使用哪個索引。Spanner 提供兩種方式,讓您指定要使用的索引。選擇下列其中一種方法來評估及比較指數:
a. 變更應用程式:您可以更新部分查詢,使用
FORCE_INDEX提示指向新索引,藉此更新向量搜尋查詢。確保查詢使用新的向量索引。使用這個方法時,您可能需要在新查詢中重新調整num_leaves_to_search。b. 變更結構定義:您可以在其中一個向量索引上設定
disable_search選項。如果設為true,Spanner 會停用向量索引。如要這麼做,請執行ALTER VECTOR INDEX結構定義變更陳述式:ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);這個方法可防止 Spanner 在資料庫中使用這個向量索引。如果您有兩個索引,並在舊索引上設定這個選項,則在套用結構定義變更後,所有查詢都會使用新索引。如果您使用
FORCE_INDEX提示指定disable_search選項設為true的向量索引,查詢就會失敗。捨棄過時的向量索引。
後續步驟
進一步瞭解 Spanner 向量索引。
進一步瞭解 Spanner 近似最近鄰。
進一步瞭解 GoogleSQL
APPROXIMATE_COSINE_DISTANCE()、APPROXIMATE_EUCLIDEAN_DISTANCE()、APPROXIMATE_DOT_PRODUCT()函式。進一步瞭解 GoogleSQL
VECTOR INDEX陳述式。