小编Mil*_*son的帖子

为什么 PostgreSQL 在将数值与 bigint 列进行比较时执行 seq 扫描?

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

背景:相比于最近的车辆位置查询timestampEXTRACT(EPOCH …

postgresql performance execution-plan postgresql-9.3 query-performance

4
推荐指数
1
解决办法
1417
查看次数