3

如果我想对一列时间戳进行分组,比如registered_at按它们发生的日期,我可以使用date_trunc('day', registered_at)registered_at::date。第一个从时间戳中删除小时和更小的单位,但仍返回时间戳,而后者将时间戳返回到日期。现在,我想知道两者是否有比另一个更好的性能。

当我查看查询计划时,理论上的成本是完全一样的,在实际执行时间中可能会有很多噪音。

-- SELECT date_trunc('day', registered_at)
Seq Scan on customers  (cost=0.00..5406.45 rows=23987 width=8) (actual time=0.023..46.811 rows=24436 loops=1)
  Filter: (created_at > '2019-06-01 00:00:00'::timestamp without time zone)
  Rows Removed by Filter: 113958
Planning time: 0.107 ms
Execution time: 48.158 ms

-- SELECT registered_at::date
Seq Scan on customers  (cost=0.00..5406.45 rows=23987 width=4) (actual time=0.017..34.353 rows=24436 loops=1)
  Filter: (created_at > '2019-06-01 00:00:00'::timestamp without time zone)
  Rows Removed by Filter: 113958
Planning time: 0.121 ms
Execution time: 35.548 ms

有谁知道在截断或随后使用时哪种方法更快group by

4

1 回答 1

0

如果多次运行测试结果不同,则可能是缓存问题。

此外,查询执行时间总是存在一些“随机噪声”。

如果您多次重复实验,并且您得到的结果在统计上对于两种情况有显着差异,并且查询是相同的,只是为每个结果行调用了不同的函数,那么差异必须是函数执行时间。

于 2019-07-04T07:27:35.800 回答