• postgresql 格式化查询树为图片 —— pgNodeGraph 与 pg_node2graph


    一、 PG默认输出格式

    1. 相关参数

           postgresql 中提供了一些debug参数,将SQL的查询树和执行计划树打印在错误日志中,并提供了简单的格式化(缩进),但实际上依旧是非常难分析的。一般这个会在学习和分析查询优化器的时候用到,DBA日常工作用的不多。

    参数名默认值描述
    debug_print_parseoff在错误日志中打印查询树/解析树
    debug_print_rewrittenoff在错误日志中打印重写后的查询树/解析树
    debug_print_planoff在错误日志中打印执行计划树
    debug_pretty_printon输出以上信息时进行简单格式化(缩进)

    2. 简单案例

    我们看一个例子,查询树的默认输出是什么样的。

    • 开启参数
    1. set debug_print_parse = on;
    2. set debug_print_plan = on;
    3. set debug_pretty_print = on;
    • 执行sql,这里只是非常简单的一个语句
    select c2 from t_insert where id=6;
    • 参考错误日志中的查询树
    1. {PLANNEDSTMT
    2. :commandType 1
    3. :queryId 0
    4. :hasReturning false
    5. :hasModifyingCTE false
    6. :canSetTag true
    7. :transientPlan false
    8. :dependsOnRole false
    9. :parallelModeNeeded false
    10. :jitFlags 0
    11. :planTree
    12. {SEQSCAN
    13. :startup_cost 0.00
    14. :total_cost 16.12
    15. :plan_rows 2
    16. :plan_width 44
    17. :parallel_aware false
    18. :parallel_safe true
    19. :async_capable false
    20. :plan_node_id 0
    21. :targetlist (
    22. {TARGETENTRY
    23. :expr
    24. {VAR
    25. :varno 1
    26. :varattno 3
    27. :vartype 1042
    28. :vartypmod 14
    29. :varcollid 100
    30. :varlevelsup 0
    31. :varnosyn 1
    32. :varattnosyn 3
    33. :location 7
    34. }
    35. :resno 1
    36. :resname c2
    37. :ressortgroupref 0
    38. :resorigtbl 16384
    39. :resorigcol 3
    40. :resjunk false
    41. }
    42. )
    43. :qual (
    44. {OPEXPR
    45. :opno 96
    46. :opfuncid 65
    47. :opresulttype 16
    48. :opretset false
    49. :opcollid 0
    50. :inputcollid 0
    51. :args (
    52. {VAR
    53. :varno 1
    54. :varattno 1
    55. :vartype 23
    56. :vartypmod -1
    57. :varcollid 0
    58. :varlevelsup 0
    59. :varnosyn 1
    60. :varattnosyn 1
    61. :location 30
    62. }
    63. {CONST
    64. :consttype 23
    65. :consttypmod -1
    66. :constcollid 0
    67. :constlen 4
    68. :constbyval true
    69. :constisnull false
    70. :location 33
    71. :constvalue 4 [ 6 0 0 0 0 0 0 0 ]
    72. }
    73. )
    74. :location 32
    75. }
    76. )
    77. :lefttree <>
    78. :righttree <>
    79. :initPlan <>
    80. :extParam (b)
    81. :allParam (b)
    82. :scanrelid 1
    83. }
    84. :rtable (
    85. {RTE
    86. :alias <>
    87. :eref
    88. {ALIAS
    89. :aliasname t_insert
    90. :colnames ("id" "c1" "c2" "c3")
    91. }
    92. :rtekind 0
    93. :relid 16384
    94. :relkind r
    95. :rellockmode 1
    96. :tablesample <>
    97. :lateral false
    98. :inh false
    99. :inFromCl true
    100. :requiredPerms 2
    101. :checkAsUser 0
    102. :selectedCols (b 8 10)
    103. :insertedCols (b)
    104. :updatedCols (b)
    105. :extraUpdatedCols (b)
    106. :securityQuals <>
    107. }
    108. )
    109. :resultRelations <>
    110. :appendRelations <>
    111. :subplans <>
    112. :rewindPlanIDs (b)
    113. :rowMarks <>
    114. :relationOids (o 16384)
    115. :invalItems <>
    116. :paramExecTypes <>
    117. :utilityStmt <>
    118. :stmt_location 0
    119. :stmt_len 34
    120. }

    已经很复杂,肉眼难以直接分析。

    二、 pg_node2graph工具

    pg_node2graph工具是在pgNodeGraph的基础上做了些加强,这里我们以它进行测试。

    1. 依赖包

    1. yum -y install graphviz
    2. yum -y install gcc-c++

    2. 下载安装

    • 下载地址

    GitHub - japinli/pg_node2graph

    • 解压文件

    其中 pg_node2graph 是执行脚本,nodes目录存放待分析文件,images存放格式化后的图片。 

    •  源码文件node2dot.cc 添加头文件 #include

    github中的文档没有写,但是如果不按以下处理执行时会报错

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include

    3. 保存查询树文本至nodes目录

    就是前面非常长的那一串

    4. 运行 pg_node2graph 脚本

    这里我把对应路径加到了环境变量,所以直接执行就可以

    5. images目录查看或下载图片

     图片如下,相对而言清晰很多。

     

    三、 主要报错及处理

    1. 找不到dot命令

    1. -bash-4.2$ pg_node2graph
    2. which: no dot in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

    dot是Linux中的一个画图工具,但yum安装的时候不叫dot,应该装

    yum -y install graphviz

    2. 找不到g++命令

    1. -bash-4.2$ pg_node2graph
    2. /data/postgres/home/postgres/pg_node2graph-main/pg_node2graph: line 29: g++: command not found

    解决方法

    yum -y install gcc-c++

    3. error: ‘exit’ was not declared in this scope

    1. -bash-4.2$ pg_node2graph
    2. node2dot.cc: In function ‘int main(int, char**)’:
    3. node2dot.cc:91:10: error: ‘exit’ was not declared in this scope
    4. exit(0);
    5. ^
    6. node2dot.cc:108:9: error: ‘exit’ was not declared in this scope
    7. exit(1);
    8. ^
    9. node2dot.cc:115:9: error: ‘exit’ was not declared in this scope
    10. exit(1);

    解决方法

    源码文件node2dot.cc 添加头文件 #include

    参考

    https://github.com/japinli/pg_node2graph
    https://github.com/shenyuflying/pgNodeGraph
    https://blog.csdn.net/ALL_BYA/article/details/121790213
    https://blog.csdn.net/weixin_44314171/article/details/107360760
    https://blog.csdn.net/m0_38059875/article/details/
     

  • 相关阅读:
    23种设计模式详解
    学习笔记(1)元素,列表,表格,表单,
    MogDB如何兼容Oracle的管道函数
    Codeforces Round 898 (Div. 4) 题解 | JorbanS
    [MAUI程序设计] 用Handler实现自定义跨平台控件
    Windows控制台ssh连接Linux,并且保持连接不断开
    全面指南:2023年国内访问与下载GitHub的优化策略
    工业风格大屏:让数据更生动,直观更简单
    SSM+线上诊疗系统 毕业设计-附源码161711
    废品回收小程序开发,助力商家拓展回收市场
  • 原文地址:https://blog.csdn.net/Hehuyi_In/article/details/126576046