簡體   English   中英

PostgreSQL 文本范圍掃描

[英]PostgreSQL text range scan

我編寫了一個查詢,其目的是獲得 10 個結果,包括當前的結果,在任一側最多填充 9 個條目,以便按字母順序排列列表,該列表可由接收者排序。 這是我正在使用的查詢,但是我的問題不在於結果,而是因為兩個查詢都沒有使用 index

(
  SELECT
    uid,
    title
  FROM
    books
  WHERE
  lower(title) < lower('Frankenstein')
  ORDER BY title desc
  LIMIT 9
)
UNION
(
  SELECT
    uid,
    title
  FROM
    books
  WHERE
  lower(title) >= lower('Frankenstein')
  ORDER BY title
  LIMIT 10
)
ORDER BY title;

我嘗試使用的索引是一個簡單的 btree,沒有 text_pattern_ops 等,如下所示:

CREATE INDEX books_title_idx ON books USING btree (lower(title));

如果我在 unioin 的第一部分運行解釋,盡管有限制和順序,它會執行全表掃描

explain analyze 
SELECT
  uid,
  title
FROM
  books
WHERE
lower(title) < lower('Frankenstein')
ORDER BY title desc
LIMIT 9

Limit (cost=69.04..69.06 rows=9 width=152) (actual time=6.276..6.292 rows=9 loops=1) -> Sort (cost=69.04..69.67 rows=251 width=152) (actual time=6.273..6.277 rows=9 loops=1) Sort Key: ((title)) Sort Method: top-N heapsort Memory: 25kB -> Seq Scan on books (cost=0.00..63.80 rows=251 width=152) (actual time=0.056..5.227 rows=267 loops=1) Filter: (lower((title)) < 'frankenstein'::text) Rows Removed by Filter: 486 Total runtime: 6.359 ms

當我對同一個查詢進行相等檢查時 -使用索引

explain analyze
SELECT
  uid,
  title
FROM
  books
WHERE
lower(title) = lower('Frankenstein')
ORDER BY title desc

Sort (cost=17.04..17.05 rows=4 width=152) (actual time=0.054..0.054 rows=0 loops=1) Sort Key: ((title)) Sort Method: quicksort Memory: 25kB -> Bitmap Heap Scan on books (cost=4.31..17.00 rows=4 width=152) (actual time=0.041..0.041 rows=0 loops=1) Recheck Cond: (lower((title)) = 'frankenstein'::text) -> Bitmap Index Scan on books_title_idx (cost=0.00..4.31 rows=4 width=0) (actual time=0.036..0.036 rows=0 loops=1) Index Cond: (lower((title)) = 'frankenstein'::text) Total runtime: 0.129 ms

當我做一個 between 查詢時同樣適用

explain analyze
SELECT
  uid,
  title
FROM
  books
WHERE
lower(title) > lower('Frankenstein') AND lower(title) < lower('Gulliver''s Travels')
ORDER BY title

Sort (cost=17.08..17.09 rows=4 width=152) (actual time=0.511..0.529 rows=25 loops=1) Sort Key: (title) Sort Method: quicksort Memory: 27kB -> Bitmap Heap Scan on books (cost=4.33..17.04 rows=4 width=152) (actual time=0.118..0.213 rows=25 loops=1) Recheck Cond: ((lower(title) > 'frankenstein'::text) AND (lower(title) < 'gulliver''s travels'::text)) -> Bitmap Index Scan on books_title_idx (cost=0.00..4.33 rows=4 width=0) (actual time=0.087..0.087 rows=25 loops=1) Index Cond: ((lower(title) > 'frankenstein'::text) AND (lower(title) < 'gulliver''s travels'::text)) Total runtime: 0.621 ms

我顯然在這里尋找的不是介於搜索之間的搜索,因為開始和結束是未知的。 那么這是一個 postgresql 限制還是除了將表掃描的成本操縱為一些愚蠢的東西之外,我可以用來說服查詢規划器使用索引?

我正在使用 PostgreSQL 9.3

用:

ORDER BY lower(title) DESC

或者

ORDER BY lower(title)

匹配您的功能索引,以便可以使用它。
ORDER BY與其他兩個查詢中的行選擇無關。 這就是為什么在這些情況下可以使用索引的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM