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 查询性能波动的主要内容,如果未能解决你的问题,请参考以下文章
连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑