首页 > 解决方案 > Postgresql 选择计数查询需要很长时间

问题描述

我的 Postgresql 9.5 数据库中有一个名为 events 的表。而这张表大约有 600 万条记录。

我正在select count(event_id) from events查询。但是这个查询需要 40 秒。这对于数据库来说是很长的时间。我event_id的表字段是主键和索引。为什么这需要很长时间?(服务器是 vmware 上的 ubuntu vm 有 4cpu)

解释:

"Aggregate  (cost=826305.19..826305.20 rows=1 width=0) (actual time=24739.306..24739.306 rows=1 loops=1)"
"  Buffers: shared hit=13 read=757739 dirtied=53 written=48"
"  ->  Seq Scan on event_source  (cost=0.00..812594.55 rows=5484255 width=0) (actual time=0.014..24087.050 rows=6320689 loops=1)"
"        Buffers: shared hit=13 read=757739 dirtied=53 written=48"
"Planning time: 0.369 ms"
"Execution time: 24739.364 ms"

标签: sqlpostgresqlpostgresql-9.5

解决方案


我知道这是一个老问题,现有答案涵盖了与此相关的绝大多数信息,但我刚刚遇到了一种情况,即 130 万行的表需要大约 35 秒才能执行简单的SELECT COUNT(*). 其他解决方案都没有帮助。问题最终是表只是膨胀并且没有被清理,所以 Postgres 无法找出查询数据的最佳方式。在我运行这个之后,查询时间下降到大约 25 毫秒!

VACUUM (ANALYZE, VERBOSE, FULL) my_table_name;

希望这对其他人有帮助!


推荐阅读