暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

PostgreSQL17 新增EXPLAIN(MEMORY)来显示优化器内存消耗

318

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 / –

可以通过下面的方式联系我

  • 微信公众号:@墨竹札记
  • 墨天轮:@墨竹
  • 微信:wshf395062788
  • PGFans:@墨竹

如果这篇文章为你带来了灵感或启发,就请帮忙点赞收藏转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!

最后修改时间:2025-02-06 10:50:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论