繁体   English   中英

Postgres没有使用“created_time / 60”的索引

[英]Postgres not using index for “created_time / 60”

我有一个系统可以保存网络中服务器的统计信息。 稍后,用户可以使用所有数据并规划其增长。 因此,将数据汇总到图表中是很重要的,即跨越一小时,一天,一周,一年等。

我正在尝试做这样的事情:

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_minute,stats_hour,stats_day,stats_week等。您拥有的数量将取决于总数据大小/性能要求。 使用简单的cron-job使摘要保持最新。 如果数据将以“延迟”时间戳进入,则可能需要稍微延迟或允许重新计算。

然后,您可以只使用摘要表的联合以及自当前小时开始以来所有行的实际总和。 这要查询的数据要少得多,并且可以尽可能快地进行查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM