PostgreSQL17 新增EXPLAIN(MEMORY)来显示优化器内存消耗
我们知道PostgreSQL不仅需要内存来执行查询,还需要内存来规划查询。在PostgreSQL17的EXPLAIN中新增了MEMORY选项,可以显示构建执行计划使用了多少内存。在官网文档中的解释为
MEMORY
包括查询规划阶段的内存消耗信息。具体来说,包括优化器在内存结构中使用的精确存储量,以及考虑分配开销的总内存。该参数默认为FALSE。
在这里我们简单的执行一个select语句来观察explain (memory)的输出情况。
testdb=# explain (memory) select * from rank1;
QUERY PLAN
----------------------------------------------------------------
Seq Scan on rank1 (cost=0.00..20310.00 rows=1000000 width=49)
Planning:
Memory: used=9kB allocated=32kB
(3 rows)
Time: 2.025 ms
通过上述的执行计划的输出,我们可以看到当指定Memory选项时,将在”Planning:“组(目前只有Buffers:)下添加一个新的“Memory:”行。在这一行中,allocated为上下文分配的内存总量,表示已分配;used为分配的内存总量减去上下文的自由列表中的内存,表示已使用。
memory参数的使用方式和其他参数一致,也可以结合其他参数一起使用,比如在这里和analyze一起使用,输出如下内容:
testdb=# explain (memory,analyze) select * from rank1;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Seq Scan on rank1 (cost=0.00..20310.00 rows=1000000 width=49) (actual time=0.048..777.948 rows=1000000 loops=1)
Planning:
Memory: used=9kB allocated=16kB
Planning Time: 0.039 ms
Execution Time: 805.604 ms
(5 rows)
Time: 805.944 ms
当EXPLAIN的输出格式为yaml时,可以看到Memory的名称稍微进行了调整。
testdb=# explain (memory,summary, format yaml) select * from rank1;
QUERY PLAN
----------------------------
- Plan: +
Node Type: "Seq Scan" +
Parallel Aware: false +
Async Capable: false +
Relation Name: "rank1"+
Alias: "rank1" +
Startup Cost: 0.00 +
Total Cost: 20310.00 +
Plan Rows: 1000000 +
Plan Width: 49 +
Planning: +
Memory Used: 9 +
Memory Allocated: 16 +
Planning Time: 0.037
(1 row)
Time: 0.330 ms
在这里我们也可以顺便看看,如果EXPLAIN的输出格式为输出是json时的样式。
testdb=# explain (memory, analyze, format json) select * from rank1;
QUERY PLAN
-------------------------------------
[ +
{ +
"Plan": { +
"Node Type": "Seq Scan", +
"Parallel Aware": false, +
"Async Capable": false, +
"Relation Name": "rank1", +
"Alias": "rank1", +
"Startup Cost": 0.00, +
"Total Cost": 20310.00, +
"Plan Rows": 1000000, +
"Plan Width": 49, +
"Actual Startup Time": 0.006,+
"Actual Total Time": 44.422, +
"Actual Rows": 1000000, +
"Actual Loops": 1 +
}, +
"Planning": { +
"Memory Used": 9, +
"Memory Allocated": 16 +
}, +
"Planning Time": 0.035, +
"Triggers": [ +
], +
"Execution Time": 68.279 +
} +
]
(1 row)
Time: 68.758 ms
总的来说,EXPLAIN(MEMORY)这个功能相对来说还是比较简单的,我们了解知道该输出的内存代表什么意思就可以,也没有太多可以描述的内容。另外查询中涉及的表越多,构建计划所需的内存就越多。对于分区表来说尤其如此。
参考
https://postgrespro.com/blog/pgsql/5970866#commit_5de890e3
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5de890e36
– / END / –
可以通过下面的方式联系我
如果这篇文章为你带来了灵感或启发,就请帮忙点赞、收藏、转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!




