PostgreSQL慢计数/组/ date_trunc混合

时间:2019-01-30 16:41:44

标签: postgresql database-performance

我有以下查询:

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混合创建的最佳索引应该是什么。

1 个答案:

答案 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,则还必须在查询中使用它...