性能差异date_trunc('day',<timestamp>)vs <timestamp> :: date

时间:2019-07-03 19:10:00

标签: postgresql query-planner

如果我想将一列时间戳分组,例如按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时,有人知道哪个方法会更快吗?

1 个答案:

答案 0 :(得分:0)

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

在查询执行时间中总会出现“随机噪声”。

如果您重复多次实验,并且两种情况下得到的结果在统计上显着不同,并且除了每个结果行都调用了不同的函数外,查询都是相同的,则差异为是函数执行时间。