Postgresql Postgres不使用“索引”;创建“U时间/60”;
我有一个在网络中保存服务器统计数据的系统。之后,用户可以使用所有数据并规划其增长。因此,重要的是将数据汇总成一个图表,即一小时、一天、一周、一年等 我正在尝试这样做:Postgresql Postgres不使用“索引”;创建“U时间/60”;,postgresql,indexing,performance,Postgresql,Indexing,Performance,我有一个在网络中保存服务器统计数据的系统。之后,用户可以使用所有数据并规划其增长。因此,重要的是将数据汇总成一个图表,即一小时、一天、一周、一年等 我正在尝试这样做: select created_time / 60, count(*) from pm_server_stat group by (created_time / 60); --with this index CREATE INDEX pm_server_stat_created_time_60 ON pm_server_sta
select created_time / 60, count(*)
from pm_server_stat
group by (created_time / 60);
--with this index
CREATE INDEX pm_server_stat_created_time_60
ON pm_server_stat
USING btree
((created_time / 60));
这就是我得到的解释
"GroupAggregate (cost=189822.36..213951.06 rows=1206435 width=8)"
" Output: ((created_time / 60)), count(*)"
" -> Sort (cost=189822.36..192838.45 rows=1206435 width=8)"
" Output: created_time, ((created_time / 60))"
" Sort Key: ((pm_server_stat.created_time / 60))"
" -> Seq Scan on public.pm_server_stat (cost=0.00..34967.44 rows=1206435 width=8)"
" Output: created_time, (created_time / 60)"
有人知道为什么会这样吗?我怀疑这些类型可能不同?PostgreSQL在9.1或之前版本中没有“覆盖”索引。这意味着它无论如何都必须访问这些行,在这种情况下,它还不如扫描它们。它们将出现在9.2版本中(如果你想试用的话,目前正在进行beta测试),但我不确定它们是否足够聪明
一旦你想要“提供的文件总数”或“传输的数据包总数”,它就永远不会起作用
通常,对于这类汇总任务,您会有一个或多个汇总表:stats\u minute、stats\u hour、stats\u day、stats\u week等。有多少汇总表取决于总数据大小/性能要求。使用简单的cron作业使摘要保持最新。如果数据带有“延迟”时间戳,您可能需要稍微延迟或允许重新计算
然后,您可以将汇总表与自当前小时开始以来所有行的实际总和合并。查询的数据要少得多,而且可以根据需要以最快的速度进行查询。是的。。。基本上你说的是“运行数据仓库”,也就是星型模式。你是对的。。。我的意图是做一个“和(进),和(出)”