如果我想将一列时间戳分组,例如按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
时,有人知道哪个方法会更快吗?
答案 0 :(得分:0)
如果多次运行测试结果不同,则可能是缓存问题。
在查询执行时间中总会出现“随机噪声”。
如果您重复多次实验,并且两种情况下得到的结果在统计上显着不同,并且除了每个结果行都调用了不同的函数外,查询都是相同的,则差异为是函数执行时间。