在postgres加速集团

时间:2013-09-03 07:23:15

标签: sql postgresql postgresql-9.2

您好我想在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秒

2 个答案:

答案 0 :(得分:3)

我从未见过任何按时间戳记的人群 - 如果您需要为每个微秒的时间进行计数,那么您必须进行大量的互动(粒度为Postgres中的时间戳dara类型。)

如果你真的打算按 date 分组:

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

或者如果你不喜欢演员表,这也有效:

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

如果上述方法无效,您可以先尝试使用analyze更新表统计信息:

analyze useractivitystatisticsentity

答案 1 :(得分:1)

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

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

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