[英]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.