向量索引最佳做法

本頁說明向量索引的最佳做法,可最佳化向量索引,並改善近似近鄰 (ANN) 查詢結果

調整向量搜尋選項

向量索引選項的最佳值取決於您的用途、向量資料集和查詢向量。您可以建立新的向量索引,並在 CREATE VECTOR INDEX 陳述式中設定 index_option_list,藉此設定及調整這些值。您可能需要進行反覆調整,才能找出特定工作負載的最佳值。

選取適當值時,請遵循下列實用準則:

  • tree_depth (樹狀結構層級):如果建立索引的資料表少於 1 千萬列,請使用 tree_depth2。否則,tree_depth3 最多支援約 100 億列的資料表。

  • num_leaves:使用資料集中的資料列數平方根。值越大,向量索引的建構時間就越長。請避免將 num_leaves 設為大於 table_row_count 除以 1000 的值,否則會導致葉片過小,成效不佳。

  • num_leaves_to_search:這個選項會指定要搜尋的索引分葉節點數量。增加 num_leaves_to_search 可提高召回率,但也會增加延遲時間和費用。建議您使用 CREATE VECTOR INDEX 陳述式中定義的葉節點總數的 1% 做為 num_leaves_to_search 的值。如果您使用篩選子句,請增加這個值來擴大搜尋範圍。

如果已達到可接受的召回率,但查詢費用過高,導致最高每秒查詢次數偏低,請按照下列步驟增加 num_leaves

  1. num_leaves 設為原始值的某個倍數 k (例如 2 * sqrt(table_row_count))。
  2. num_leaves_to_search 設為原始值的相同倍數 k。
  3. 實驗降低 num_leaves_to_search,在維持召回率的同時,改善費用和每秒查詢次數。

提高召回率

如要提高召回率,請考慮調整 num_leaves_to_search 值或重建向量索引。

如果 num_leaves_to_search 值太小,您可能會發現某些查詢向量的最近鄰難以尋找。建立新的向量索引並提高 num_leaves_to_search 值,有助於搜尋更多葉節點,進而提升召回率。最近的查詢可能包含更多這類難以處理的向量。

重建向量索引

向量索引的樹狀結構會在建立時針對資料集進行最佳化,之後會維持不變。因此,如果在建立初始向量索引後加入顯著不同的向量,樹狀結構可能會不夠理想,導致召回率較差。

如要在不停機的情況下重建向量索引,請按照下列步驟操作:

  1. 在與目前向量索引相同的嵌入資料欄上建立新向量索引,並視需要更新參數 (例如 OPTIONS)。索引建立完成後,您可以評估哪個索引的成效較佳。如果是,請繼續下一個步驟。 否則,請繼續捨棄過時的向量索引。
  2. 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,查詢就會失敗。

  3. 捨棄過時的向量索引。

後續步驟