gpt4 book ai didi

sql - Postgresql 选择计数查询需要很长时间

转载 作者:行者123 更新时间:2023-12-04 13:39:47 25 4
gpt4 key购买 nike

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

我正在运行 select count(event_id) from events询问。但是这个查询需要 40 秒。这对于数据库来说是很长的时间。我的 event_id表的字段是主键和索引。为什么这需要很长时间? (服务器是 ubuntu vm on vmware 有 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"

最佳答案

在 PostgreSQL 如何执行 count() 的决定中,有多种因素起着重要作用。 ,但首先,您在 count 中使用的列功能无所谓。其实如果你不需要DISTINCT数数,坚持 count(*) .

您可以尝试以下方法来强制进行仅索引扫描:

SELECT count(*) FROM (SELECT event_id FROM events) t;

...如果这仍然导致顺序扫描,那么索引很可能不会比表本身小多少。要仍然查看仅索引扫描的执行方式,您可以使用以下命令强制执行它:

SELECT count(*) FROM (SELECT event_id FROM events ORDER BY 1) t;

如果这不是更快,您还应该考虑将 PostgreSQL 升级到至少 9.6 版,其中引入了 parallel sequential scans加速这些事情。

此外,您可以从各种技术中进行选择以提供在很大程度上取决于您的用例和要求的计数,从而实现显着的加速:
  • Faster PostgreSQL Counting

  • 最后但并非最不重要的一点,请始终提供扩展解释的输出,如已推荐的@a_horse_with_no_name,例如:

    EXPLAIN (ANALYZE, BUFFERS) SELECT count(event_id) FROM events;

    关于sql - Postgresql 选择计数查询需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55018986/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com