首页 > 解决方案 > 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 是一个分区表的简单视图,其中包含一系列连接的列。

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

快速查询计划 & 慢查询计划

标签: postgresqlquery-optimization

解决方案


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

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

ALTER TABLE some_table SET (autovacuum_analyze_scale_factor = 0.02);

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

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

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


推荐阅读