PostgreSQL 查询性能波动

Posted

技术标签:

【中文标题】PostgreSQL 查询性能波动【英文标题】:PostgreSQL Query Performance Fluctuates 【发布时间】:2020-10-20 03:39:53 【问题描述】:

我们有一个加载数据然后在 PostgreSQL 中进行数据质量控制的系统。 QC 功能的性能在我们的其中一种环境中波动很大,没有明显的规律。我能够在 QC 函数中跟踪以下简单查询的性能:

WITH foo AS (SELECT full_address, jsonb_agg (gad_rec_id) gad_rec_ids
            FROM azgiv.v_full_addresses 
            WHERE gad_gly_id = 495
            GROUP BY full_address 
            HAVING count(1) > 1)
SELECT gad_nguid, gad_rec_id, foo.full_address
        FROM azgiv.v_full_addresses JOIN foo
            ON foo.full_address = v_full_addresses.full_address
        AND v_full_addresses.gad_gly_id = 495;

当我遇到性能缓慢的情况(图 2)时,我必须在查询计划更改为快速之前分析视图后面的表(图 1)。 v_full_addresses 是一个分区表的简单视图,其中包含一系列连接的列。

这是上述查询的查询计划的两张图片。在了解查询优化方面,我是新手,非常感谢任何帮助。

&

【问题讨论】:

图像难以阅读且包含的信息很少。您应该将EXPLAIN (ANALYZE, BUFFERS) 显示为文本。 这可能是 *** 的拼写错误或简化,但据我所知,jsonb_agg() 的结果在查询中的任何地方都没有使用;将其排除在外可能会为您节省一些 CPU 周期。另外,如果我可能会问,您使用什么来创建这些查询计划图? @deroby 我使用 PgAdmin IV 生成图表。 【参考方案1】:

如果在您ANALYZE 一个表之后性能有所提高,这意味着数据库关于数据分布的知识已经过时了。

最好的补救办法是告诉 PostgreSQL 更频繁地收集这些统计信息:

ALTER TABLE some_table SET (autovacuum_analyze_scale_factor = 0.02);

0.02 比默认的 0.1 低五倍,因此统计信息的收集频率将增加五倍。

如果在批量加载后立即生成错误的查询计划,则必须选择不同的策略。在这种情况下,问题在于自动分析最多需要一分钟才能启动并计算新的统计数据。

在这种情况下,您应该在批量加载结束时运行显式 ANALYZE

【讨论】:

我用改进的参数设置了16个分区表,但没有解决一致性问题。所以目前,在加载函数中,我在批量数据插入之后添加了表 ANALYZE。我觉得这并不理想,直到我有更多的时间来使用诸如 naptime 和 max_worker 之类的 autovacuum 参数。谢谢! 这是优雅的解决方案。请参阅我的更新答案。 太棒了。非常感谢你,劳伦兹!

以上是关于PostgreSQL 查询性能波动的主要内容,如果未能解决你的问题,请参考以下文章

如何加快 PostgreSQL 中的插入性能

连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑

PostgreSQL自动提交SELECT查询的效率

PostgreSQL最常用的函数-查询(最全)

使用 SPI 的 PostgreSQL 并行查询可能吗?