全部產品
Search
文件中心

PolarDB:篩選

更新時間:Apr 29, 2025

通過為最近鄰(Nearest Neighbor)查詢建立帶有WHERE子句的索引,限制查詢範圍,從而提升高維資料查詢效率。

精確索引

支援基於以下精確索引類型,通過WHERE子句提供快速且精確的最近鄰搜尋。

  • (預設)B-tree

  • Hash

  • GiST

  • SP-GiST

  • GIN

  • BRIN

對於多列資料,您還可選擇多列索引。此類索引適用於匹配行數佔總行數比例較低的情境。

近似索引

除非匹配行數佔總行數比例較低,否則建議使用近似索引。近似索引掃描後執行過濾操作,例如,當條件匹配10%行且使用HNSW索引(預設hnsw.ef_search=40),平均只匹配4行,如需擷取多行結果可按需增大hnsw.ef_search值。

但使用近似索引執行帶有過濾條件的查詢可能會返回較少結果。對此0.8.0版本新增迭代索引掃描,可自動掃描更多索引內容,直到找到足夠的結果(或者達到hnsw.max_scan_tuplesivfflat.max_probes的限制)。

外掛程式版本確認

  1. 確認外掛程式版本。

    SELECT * FROM pg_extension WHERE extname = 'vector';

    查看返回結果中extversion欄位,返回結果如下:

      oid  | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition 
    -------+---------+----------+--------------+----------------+------------+-----------+--------------
     17941 | vector  |    17865 |         2200 | t              | 0.8.0      |           | 
    (1 row)
  2. (可選)如不滿足0.8.0版本要求,可通過以下語句升級。

    ALTER EXTENSION vector UPDATE TO '0.8.0';

迭代索引掃描

迭代索引掃描支援以下兩種排序方式:

  • strict_order:strict 模式,確保結果按照與查詢點的距離精確排序。

  • relaxed_order:寬鬆模式,允許結果在距離排序上略有偏差,但提供更好的召回率。此外,還可以通過物化CTE擷取嚴格排序結果。

樣本

  • 啟用迭代索引掃描。

    • 設定為strict 模式。

      -- HNSW索引
      SET hnsw.iterative_scan = strict_order;
      
      -- IVFFlat索引
      SET ivfflat.iterative_scan = strict_order;
    • 設定為寬鬆模式。

      -- HNSW索引
      SET hnsw.iterative_scan = relaxed_order;
      
      -- IVFFlat索引
      SET ivfflat.iterative_scan = relaxed_order;
  • 寬鬆模式時使用物化CTE擷取嚴格排序結果。

    1. 啟用迭代索引掃描,並設定為寬鬆模式

    2. 使用物化CTE擷取嚴格排序結果。

      WITH relaxed_results AS MATERIALIZED (
          SELECT id, embedding <-> '[1,2,3]' AS distance FROM items WHERE id = 1 ORDER BY distance LIMIT 5
      ) SELECT * FROM relaxed_results ORDER BY distance;

      對於按距離過濾的查詢,在使用物化CTE時建議將距離過濾條件放在外部,其他過濾條件應放置在CTE內部,以獲得最佳效能。

      WITH nearest_results AS MATERIALIZED (
          SELECT id, embedding <-> '[1,2,3]' AS distance FROM items ORDER BY distance LIMIT 5
      ) SELECT * FROM nearest_results WHERE distance < 5 ORDER BY distance;

迭代索引掃描參數

由於掃描近似索引的較大部分成本較高,因此可以設定相關參數控制掃描結束時機。

索引類型

參數

描述

HNSW

hnsw.max_scan_tuples

指定HNSW索引中允許的最大掃描元組數量,預設為20,000。

hnsw.scan_mem_multiplier

執行HNSW演算法時,允許的記憶體乘數,預設為1。與hnsw.max_scan_tuples配合確定在掃描候選項時的記憶體使用量量。

如果增加hnsw.max_scan_tuples未能提高召回率,可以嘗試增加此值。

IVFFlat

ivfflat.max_probes

在IVFFlat索引中進行查詢時,允許探測的最大探針數量。如果該值小於ivfflat.probes,則使用ivfflat.probes值。