给定一个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