【发布时间】:2020-04-25 08:04:28
【问题描述】:
我有一个表,我想在其中按主键的前缀进行搜索。主键具有03.000221.1、03.000221.2、03.000221.3 等值,我想检索所有以03.000221. 开头的值。
我的第一个想法是使用 LIKE '03.000221.%' 进行过滤,认为 Postgres 足够聪明,可以在索引中查找 03.000221. 并从该点执行范围扫描。但是不,这会执行顺序扫描。
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Gather (cost=1000.00..253626.34 rows=78 width=669)
Workers Planned: 2
-> Parallel Seq Scan on ... (cost=0.00..252618.54 rows=32 width=669)
Filter: ((id ~~ '03.000221.%'::text)
JIT:
Functions: 2
Options: Inlining false, Optimization false, Expressions true, Deforming true
如果我使用普通的 >= 和 < 范围进行等效操作,例如。 G。 id >= '03.000221.' and id < '03.000221.Z' 它确实使用了索引:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using ... on ... (cost=0.56..8.58 rows=1 width=669)
Index Cond: ((id >= '03.000221.'::text) AND (id < '03.000221.Z'::text))
但这更脏,在我看来,Postgres 应该能够推断出它可以使用LIKE 进行等效的索引范围查找。为什么不呢?
【问题讨论】:
标签: postgresql indexing