您好我想在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秒
答案 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。两个表中的行数相等,但基数不同,因此优化器选择不同的计划。
我认为在不了解您的数据的情况下更难具体化。
您可能会发现此链接很有用: