postgresql - PostgreSQL 查询性能波动
问题描述
我们有一个加载数据然后在 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 是一个分区表的简单视图,其中包含一系列连接的列。
这是上述查询的查询计划的两个图像。在了解查询优化方面,我是新手,非常感谢任何帮助。
解决方案
如果在您ANALYZE
使用表后性能有所提高,则意味着数据库关于数据分布的知识已经过时。
最好的补救办法是告诉 PostgreSQL 更频繁地收集这些统计信息:
ALTER TABLE some_table SET (autovacuum_analyze_scale_factor = 0.02);
0.02 比默认的 0.1 低五倍,因此统计信息的收集频率将增加五倍。
如果在批量加载后立即生成错误的查询计划,则必须选择不同的策略。在这种情况下,问题在于自动分析需要一分钟才能启动并计算新的统计数据。
ANALYZE
在这种情况下,您应该在批量加载结束时运行显式。
推荐阅读
- javascript - 在反应钩子中获取formData中的空值
- java - 使用 2 个道具对对象列表进行排序,即 String 和 Integer,按字母顺序对该列表进行排序,如果 String 相同,则按 DESC Integer 排序
- javascript - 从 html 字符串文本值中查找具有相同类名的跨度值
- angular - 验证和授权所有微软帐户,包括个人帐户和其他租户
- python - 使用装饰器更改参数注释
- sql - Using MODEL clause in Oracle and returning previous values
- kotlin - 使用 Kotlin 泛型和密封接口编译错误
- facebook - Facebook 页面选项卡应用程序“内容被阻止”错误
- c# - 如何在另一个脚本中调用 OnClick 按钮?
- c++ - 有没有人遇到过偶尔的 TSAN 问题?