给定一个vp
具有列timestamp
类型的表bigint
和一个btree
索引timestamp
,为什么 Postgres 会忽略索引并在timestamp
与浮点值比较时运行 seq 扫描,当索引扫描会产生相同的结果时?
SELECT * FROM vp WHERE vp.timestamp > 1470752584
需要48 毫秒:
在 vp 上使用 vp_ts_idx 进行索引扫描(cost=0.57..257.87 rows=2381 width=57)(实际时间=0.014..38.669 rows=80323 loops=1) 索引条件:(“时间戳”> 1470752584) 总运行时间:48.322 毫秒
SELECT * FROM vp WHERE vp.timestamp > 1470752584.1
需要103 秒,因为它忽略vp_ts_idx
并执行整个表的 seq 扫描:
vp 上的 Seq Scan (cost=0.00..7378353.16 rows=95403915 width=57) (实际时间=62625.420..103122.701 rows=98240 loops=1) 过滤器:(("timestamp")::numeric > 1470752584.1) 过滤器删除的行:285945491 总运行时间:103134.333 毫秒
背景:相比于最近的车辆位置查询timestamp
用EXTRACT(EPOCH …
postgresql performance execution-plan postgresql-9.3 query-performance