当前位置: 首页 > news >正文

PostgreSQL查看sql的执行计划

PostgreSQL查看sql的执行计划

基础信息
OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo)
DB版本:16.2
pg软件目录:/home/pg16/soft
pg数据目录:/home/pg16/data
端口:5777

在PostgreSQL中,查看SQL查询的执行计划是性能调优和问题诊断的重要步骤。PostgreSQL提供了一个叫做EXPLAIN的命令,可以让你查看查询的执行计划。通过EXPLAIN命令,你可以看到查询将如何执行,包括访问表的方法和使用的索引,预计的执行成本等。

使用EXPLAIN命令

EXPLAIN命令有几种变体,你可以根据需要选择使用。

  1. 基本形式

    这会展示查询的执行计划,但不会执行查询:

    EXPLAIN SELECT * FROM your_table WHERE condition;
    
  2. 带有分析

    这会展示执行计划并实际执行查询,提供实际执行时间等详细信息:

    EXPLAIN ANALYZE SELECT * FROM your_table WHERE condition;
    
  3. 可视化格式

    这个选项将结果格式化为更易读的文本树状结构(在PostgreSQL 13及以上版本中可用):

    EXPLAIN (FORMAT JSON) SELECT * FROM your_table WHERE condition;
    

    或者:

    EXPLAIN (FORMAT YAML) SELECT * FROM your_table WHERE condition;
    
  4. 其他有用参数

    • BUFFERS: 显示缓冲区使用情况。
    • VERBOSE: 提供更详细的信息。
    • COSTS: 显示执行成本(默认启用)。
    • TIMING: 显示每个操作消耗的时间(EXPLAIN ANALYZE中默认启用)。

    示例:

    EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM your_table WHERE condition;
    

输出解释

EXPLAINEXPLAIN ANALYZE 的输出通常包含以下信息:

  • Node Type: 表示执行计划的每个节点的类型,如Seq Scan(顺序扫描)、Index Scan(索引扫描)等。
  • Cost: 预估的开始和结束成本,单位是cost,主要用来比较不同的查询计划。
  • Rows: 预估返回的行数。
  • Width: 每行的预估字节宽度。
  • Actual Time: 实际执行的时间(仅在EXPLAIN ANALYZE中出现)。
  • Loops: 循环次数(仅在EXPLAIN ANALYZE中出现)。

使用注意事项

  • 测试环境: EXPLAIN ANALYZE会实际执行查询,因此应在测试环境或在不影响生产的情况下使用。
  • 缓存影响: 多次执行同一查询可能会因为数据缓存导致不准确的分析结果。在分析前重启数据库或清除缓存可能会有所帮助。
  • 复合查询: 对复杂查询或涉及多个表的查询,通常需要更详细的执行计划分析,查看各个步骤的执行成本和时间。
示例 1:基本形式

查询:

postgres=# SELECT * FROM t2 WHERE id = '99';id |  name   
----+---------99 | haha_99
(1 row)

执行计划:

postgres=# EXPLAIN SELECT * FROM t2 WHERE id = '99';QUERY PLAN                            
------------------------------------------------------------------Index Scan using idx_t2 on t2  (cost=0.28..8.29 rows=1 width=12)Index Cond: (id = 99)
(2 rows)

经过格式化的执行计划

postgres=# EXPLAIN (FORMAT YAML) SELECT * FROM t2 WHERE id = '99';QUERY PLAN           
-------------------------------- Plan:                      +Node Type: "Index Scan"  +Parallel Aware: false    +Async Capable: false     +Scan Direction: "Forward"+Index Name: "idx_t2"     +Relation Name: "t2"      +Alias: "t2"              +Startup Cost: 0.28       +Total Cost: 8.29         +Plan Rows: 1             +Plan Width: 12           +Index Cond: "(id = 99)"
(1 row)postgres=# 
示例 2:带有分析信息

查询:

postgres=# EXPLAIN ANALYZE SELECT * FROM t2 WHERE id = '99';QUERY PLAN                                                 
------------------------------------------------------------------------------------------------------------Index Scan using idx_t2 on t2  (cost=0.28..8.29 rows=1 width=12) (actual time=0.014..0.015 rows=1 loops=1)Index Cond: (id = 99)Planning Time: 0.063 msExecution Time: 0.029 ms
(4 rows)

通过分析这些信息,你可以更加了解查询的性能瓶颈,并做出相应的优化建议,例如添加索引、更改查询结构等。

谨记:心存敬畏,行有所止。

http://www.lryc.cn/news/350404.html

相关文章:

  • macOS Ventura 13如何设置定时重启(命令行)
  • 【sass简介以及如何安装使用】
  • Git版本控制工具的原理及应用详解(四)
  • AI图书推荐:ChatGPT全面指南—用AI帮你更健康、更富有、更智慧
  • C++ | Leetcode C++题解之第92题反转链表II
  • 【管理咨询宝藏99】离散制造智能工厂战略规划方案
  • java8 Stream使用中的一些实践
  • 入门篇:Kafka基础知识·
  • SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析
  • 每日一题——力扣206. 反转链表(举一反三、思想解读)
  • 【qt】纯代码界面设计
  • 【深度学习】SDXL中的Offset Noise,Diffusion with Offset Noise,带偏移噪声的扩散
  • 开发属于自己的Spring Boot Starter-18
  • C中Mysql的基本api接口
  • grafana10.x报错 Failed to upgrade legacy queries Datasource x was not found
  • 项目管理-案例重点知识(干系人管理)
  • 微信小程序踩坑,skyline模式下,scroll-view下面的一级元素设置margin中的auto无效,具体数据有效
  • jspXMl标记语言基础
  • 【DevOps】Linux 与虚拟局域网 (VLAN) 详解
  • 《表格新视界:从罗列到洞察的飞跃》
  • 风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)
  • 0基础安装 composer
  • MYSQL-9.问题排查
  • 制造企业数据管理:从数据到价值的转化
  • 单例模式介绍
  • Facebook企业户/在Facebook上做推广有什么好处?
  • Go GORM实战(二) | 数据库连接的N种方式
  • Cocos Creator 2D Mask与Layout 使用详解
  • 项目-坦克大战
  • 代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II