0

嗨,我想在 postgres 中创建一个统计选择

createddate 是没有时区的时间戳

SELECT createddate, count(*) FROM useractivitystatisticsentity GROUP BY createddate

计划看起来像这样

GroupAggregate  (cost=232569.83..256698.22 rows=1378765 width=8)
  ->  Sort  (cost=232569.83..236016.75 rows=1378765 width=8)
        Sort Key: createddate
        ->  Seq Scan on useractivitystatisticsentity  (cost=0.00..54268.65 rows=1378765 width=8)

但是添加索引后计划没有改变

CREATE INDEX ysdfg
  ON useractivitystatisticsentity
  USING btree
  (createddate );

任何想法如何加快速度?1.000.000 行大约需要 100 秒

4

2 回答 2

3

我从未见过任何人按时间戳分组 - 如果您需要对每微秒时间进行计数(Postgres 中时间戳 dara 类型的粒度),您必须进行大量交互。

如果您真的打算按日期分组:

SELECT createddate :: date, count(*)
FROM useractivitystatisticsentity
GROUP BY 1

或者如果您不喜欢演员表,这也可以:

SELECT date_trunc('day', createddate), count(*)
FROM useractivitystatisticsentity
GROUP BY 1

如果上述方法没有帮助,您可以先尝试使用以下方法更新表统计信息analyze

analyze useractivitystatisticsentity
于 2013-09-03T13:54:01.993 回答
1

查询计划取决于表中数据的基数 - 检查这个sql fiddle 演示。两个表中的行数相等,但基数不同,因此优化器选择不同的计划。

我认为在不了解您的数据的情况下很难更具体。

您可能会发现此链接很有用:

于 2013-09-03T11:28:14.040 回答