sql - 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"
解决方案
我知道这是一个老问题,现有答案涵盖了与此相关的绝大多数信息,但我刚刚遇到了一种情况,即 130 万行的表需要大约 35 秒才能执行简单的SELECT COUNT(*)
. 其他解决方案都没有帮助。问题最终是表只是膨胀并且没有被清理,所以 Postgres 无法找出查询数据的最佳方式。在我运行这个之后,查询时间下降到大约 25 毫秒!
VACUUM (ANALYZE, VERBOSE, FULL) my_table_name;
希望这对其他人有帮助!
推荐阅读
- c# - 当 IDENTITY_INSERT 设置为 OFF 时,无法在表“消息”中插入标识列的显式值
- javascript - 对数组感到困惑
- grafana - Grafana 通过 API 覆盖现有仪表板
- vb.net - VB.NET 以新形式从发件人更改文本
- angular - 在 Angular 9 CLI webworker 中导入 mathjs 时出错
- java - FragmentManager 尚未附加到主机
- r - 如何在 r 中使用 group_by 来解决我的问题。还有其他解决方案吗?
- java - Deepspeech java.lang.UnsatisfiedLinkError:/usr/lib/libdeepspeech-jni.so:liblog.so:错误的 ELF 类:ELFCLASS32
- r - 将多个列 ID 折叠成一个 ID 列
- extjs - Sencha 开放工具和 Docker