• 【PostgreSQL17新特性之-explain命令新增选项】


    EXPLAIN是一个用于显示语句执行计划的命令,可用于显示以下语句类型之一的执行计划:

    1. - SELECT
    2. - INSERT
    3. - UPDATE
    4. - DELETE
    5. - VALUES
    6. - EXECUTE
    7. - DECLARE
    8. - CREATE TABLE AS
    9. - CREATE MATERIALIZED VIEW

    PostgreSQL17-beta1版本近日发布了,新版本里,explain命令新增了两个选项,分别是MEMORY 和SUMMARY。

    1. postgres<17beta1>(ConnAs[postgres]:PID[23802] 2024-05-28/23:37:23)=# \h explain
    2. Command: EXPLAIN
    3. Description: show the execution plan of a statement
    4. Syntax:
    5. EXPLAIN [ ( option [, ...] ) ] statement
    6. where option can be one of:
    7. ANALYZE [ boolean ]
    8. VERBOSE [ boolean ]
    9. COSTS [ boolean ]
    10. SETTINGS [ boolean ]
    11. GENERIC_PLAN [ boolean ]
    12. BUFFERS [ boolean ]
    13. SERIALIZE [ { NONE | TEXT | BINARY } ]
    14. WAL [ boolean ]
    15. TIMING [ boolean ]
    16. SUMMARY [ boolean ]
    17. MEMORY [ boolean ]
    18. FORMAT { TEXT | XML | JSON | YAML }
    19. URL: https://www.postgresql.org/docs/17/sql-explain.html

    image.png

    1.EXPLAIN的SERIALIZE选项

    EXPLAIN(ANALYZE,SERIALIZE)允许收集有关查询发出的数据量的统计信息,以及将数据转换为在线格式所需的时间。以前,如果不将数据实际发送到客户端,就无法对此进行调查,在这种情况下,网络传输成本可能会淹没您想要看到的内容。特别是,此功能允许在格式化过程中研究压缩或离线数据的反TOAST(de-TOASTing)成本。

    SERIALIZE(序列化)是将数据对象(数据存储区域中表示的代码和数据的组合)转换为一系列字节的过程,这些字节以易于传输的形式保存对象的状态。在这种序列化形式下,数据可以传递到另一个数据存储(例如内存计算平台)、应用程序或其他目标。举个例子,从 toast 获取数据并生成要发送到客户端的输出就属于序列化的时间。

    image.png

    具体测试如下,可以看到SERIALIZE选项必须和ANALYZE一起使用,众所周知,explain带有ANALYZE选项后,这条SQL对应会实际进行执行,所以对于线上一些可能影响性能比较大的SQL,或者涉及到数据变更的SQL的时候,需要谨慎评估。可以看到有了这个新的SERIALIZE选项,执行计划里可以看到序列化的实际时间,方便了我们对于SQL的进一步分析和优化。

    1. postgres<17beta1>(ConnAs[postgres]:PID[23802] 2024-05-29/00:20:33)=# explain select * from t1;
    2. +-------------------------------------------------------+
    3. | QUERY PLAN |
    4. +-------------------------------------------------------+
    5. | Seq Scan on t1 (cost=0.00..20.15 rows=415 width=273) |
    6. +-------------------------------------------------------+
    7. (1 row)
    8. postgres<17beta1>(ConnAs[postgres]:PID[23802] 2024-05-29/00:20:34)=# explain (SERIALIZE) select * from t1;
    9. ERROR: EXPLAIN option SERIALIZE requires ANALYZE
    10. postgres<17beta1>(ConnAs[postgres]:PID[23802] 2024-05-29/00:20:36)=# explain (analyze,SERIALIZE) select * from t1;
    11. +---------------------------------------------------------------------------------------------------+
    12. | QUERY PLAN |
    13. +---------------------------------------------------------------------------------------------------+
    14. | Seq Scan on t1 (cost=0.00..20.15 rows=415 width=273) (actual time=0.012..0.054 rows=415 loops=1) |
    15. | Planning Time: 0.041 ms |
    16. | Serialization: time=0.703 ms output=87kB format=text |
    17. | Execution Time: 0.792 ms |
    18. +---------------------------------------------------------------------------------------------------+
    19. (4 rows)

    image.png

    2.EXPLAIN的MEMORY选项

    PostgreSQL17-beta1添加了EXPLAIN (MEMORY)选项来报告规划器的内存消耗。

    当指定Memory选项时,这将在"Planning:"(目前只有"Buffers:")下添加一个新的"Memory:"行。PostgreSQL17-beta1为planner活动创建了一个单独的内存上下文,仅在给出此选项时使用。

    该上下文分配的内存总量报告为allocated(已分配);从中减去上下文的自由列表中的内存,并将结果报告为used(已使用)。

    1. postgres<17beta1>(ConnAs[postgres]:PID[24195] 2024-05-29/01:23:43)=# explain select * from t1;
    2. +-------------------------------------------------------+
    3. | QUERY PLAN |
    4. +-------------------------------------------------------+
    5. | Seq Scan on t1 (cost=0.00..20.15 rows=415 width=273) |
    6. +-------------------------------------------------------+
    7. (1 row)
    8. postgres<17beta1>(ConnAs[postgres]:PID[24195] 2024-05-29/01:23:55)=# explain (memory) select * from t1;
    9. +-------------------------------------------------------+
    10. | QUERY PLAN |
    11. +-------------------------------------------------------+
    12. | Seq Scan on t1 (cost=0.00..20.15 rows=415 width=273) |
    13. | Planning: |
    14. | Memory: used=20kB allocated=32kB |
    15. +-------------------------------------------------------+
    16. (3 rows)

    image.png

    参考链接:

    1.https://www.depesz.com/2024/04/11/waiting-for-postgresql-17-invent-serialize-option-for-explain/
    2.https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=5de890e3610d5a12cdaea36413d967cf5c544e20
    3.https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=06286709ee0637ec7376329a5aa026b7682dcfe2
    4.https://hazelcast.com/glossary/serialization/

  • 相关阅读:
    《构建之法》笔记---第六章 敏捷流程
    无设计经验也能制作专业国庆微传单
    web自动化测试(java+seleium)元素定位,全屏截图
    算法练习8——有序三元组中的最大值
    Linux用户增删改查,修改密码,查看当前用户ID,切换用户
    小程序 wxml2canvas开发文档
    [TIST 2022]No Free Lunch Theorem for Security and Utility in Federated Learning
    Android WMS——ViewRootImpl分析(六)
    微信小程序毕业设计开题报告_springboot音乐网站
    【附源码】Python计算机毕业设计企业人事管理系统
  • 原文地址:https://blog.csdn.net/weixin_47308871/article/details/139349437