我有以下查询:
select count(*), date_trunc('day', updated_at) from test group by date_trunc('day', updated_at);
以及解释时的内容如下:
GroupAggregate (cost=213481.83..223749.85 rows=245009 width=8)
-> Sort (cost=213481.83..215883.63 rows=960720 width=8)
Sort Key: (date_trunc('day'::text, updated_at))
-> Index Only Scan using updatedat on test (cost=0.00..91745.26 rows=960720 width=8)
如您所见,它的成本很高,查询时间为6231.58 ms。
有没有办法改善这一点?为这种count / group / date_trunc混合创建的最佳索引应该是什么。
答案 0 :(得分:0)
如果表中确实有25万个不同的日期,那么您可能做不到这件事。增加eval $value
可以加快排序速度。
但是,如果不同天数明显减少,则问题在于,除非创建索引,否则PostgreSQL无法估算work_mem
的结果分布。
date_trunc
如果CREATE INDEX ON test (date_trunc('day', updated_at));
是updated_at
,则可以正常工作。对于timestamp without time zone
,您必须指定一个时区,因为否则结果将取决于会话时区,这使得它对于索引不可用:
timestamp with time zone
然后CREATE INDEX ON test (date_trunc('day', updated_at AT TIME ZONE 'UTC'));
表,增加ANALYZE
,看看是否可以获得散列聚合而不是排序。
当然,如果必须在索引定义中使用work_mem
,则还必须在查询中使用它...