我正在开发一个包含多个表的 PostgreSQL 数据库,每个表包含数百万行。我的一些具有多个联接的查询运行速度比预期慢,我想使用 EXPLAIN 和 ANALYZE 工具来确定根本原因。
具体来说,我想了解:
**这是我的一个查询的简化版本: ** 选择a.名称,b.详细信息 FROM 表_a JOIN table_b b ON a.id = b.a_id WHERE a.status = '活动';
我寻找四件事:
EXPLAIN (ANALYZE)
输出中的行计数错误估计。如果估计行数与实际行数之间存在十倍或更多的系数,则表明存在问题。尝试改进估计。
需要花费大量时间的执行计划节点。如果你加快速度,你就会有所收获。您必须从较高的节点中减去较低的节点才能获得净时间。不要忘记乘以
loops
计数!
EXPLAIN (ANALYZE, BUFFERS)
输出中使用的总缓冲区。同样,您必须减去较低的节点。我认为缓冲区计算查询的“足迹”。努力把它放下,你就会赢。
检查是否有过多的“过滤器删除的行”。更好的索引通常会提高性能。
还有其他东西,例如“堆获取”和临时缓冲区,但以上是最重要的东西。
使用像https://explain.depesz.com这样的计划分析工具将使分析变得更加容易。