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

PG-EXPLAIN基础

熟悉sql的都知道EXPLAIN可以查看当前sql的查询计划及使用的扫描类型,下面我们就来讲讲PG中EXPLAN返回内容。

PG - EXPLAIN基础

在PG执行EXPLAIN后,返回的是一个计划结点的树。最底层的结点是扫描结点:它们从表中返回未经处理的行。

如果查询需要连接、聚集、排序、或者在未经处理的行上的其它操作,那么就会在扫描结点之上有其它额外的结点来执行这些操作,这些操作也可能出现不同的结点类型。

EXPLAIN会给计划树中每个结点都输出一行,显示基本的结点类型和规划器为该计划结点的执行所做的开销估计。 第一行(最上层的结点)是对该计划的总执行开销的估计;规划器试图最小化的就是这个数字。

EXPLAIN select * from user_info ;QUERY PLAN
-------------------------------------------------------------Seq Scan on user_info  (cost=0.00..458.00 rows=10000 width=244)

常见的扫描类型有:

  1. 顺序扫描-Seq Scan
  2. 索引扫描-Index Scan
    通过索引快速定位数据位置,再回表(Heap)读取完整行
  3. 位图索引扫描-Bitmap Heap Scan
  4. 仅索引扫描-Index Only Scan
    索引包含查询所需的所有字段,无需回表

由于上述查询我们没有加任何where条件,所以它必须扫描表中的所有行,因此数据库规划器只能选择使用顺序扫描(类似mysql中的ALL)。被包含在圆括号中的数字含义从左至右分别是:

  • 估计的启动开销。在输出阶段可以开始之前消耗的时间,例如在一个排序结点里执行排序的时间。

  • 估计的总开销。这个估计值基于的假设是计划结点会被运行到完成,即所有可用的行都被检索。不过实际上一个结点的父结点可能很快停止读所有可用的行(见下面的LIMIT例子)。

  • 这个计划结点输出行数的估计值。同样,也假定该结点能运行到完成。

  • 预计这个计划结点输出的行平均宽度(以字节计算)。

开销的计算规则是根据PG配置中的页面读取数seq_page_cost和扫描的行数cpu_tuple_cost来决定的

seq_page_cost:
设置规划器计算一次顺序磁盘页面抓取的开销,默认为1cpu_tuple_cost:
设置规划器对一次查询中处理每一行的代价估计。默认值是 0.01

计算规则为 开销 = (页面读取数seq_page_cost)+(扫描的行数cpu_tuple_cost)

回到我们的例子,现在我们在sql中加入where条件

EXPLAIN select * from user_info where a < 7000;QUERY PLAN
-------------------------------------------------------------
Seq Scan on user_info  (cost=0.00..483.00 rows=7001 width=244)Filter: (a < 7000)

请注意EXPLAIN输出显示WHERE子句被当做一个“过滤器”条件附加到顺序扫描计划结点。 这意味着该计划结点为它扫描的每一行检查该条件,并且只输出通过该条件的行。
因为WHERE子句的存在,估计的输出行数降低了。不过,扫描仍将必须访问所有全表的10000行,因此开销没有被降低,反而还有所上升(准确来说,上升了 10000* cpu_operator_cost)以反映检查WHERE条件所花费的额外 CPU 时间。

以上就是如何查看EXPLAIN基础的返回内容,具体调优方向,还需要通过新增索引或者修改slow sql慢慢调试。

相关文章:

  • Java面向对象:抽象类详解
  • 计算机网络应用层(5)-- P2P文件分发视频流和内容分发网
  • 重温TCP通信过程
  • 亚组风险比分析与可视化
  • 解读和分析mysql性能数据时,如何确定性能瓶颈的具体位置?
  • 「OC」源码学习——alloc与init的实现
  • 备份服务器,备份服务器数据有哪些方法可以实现?
  • 电池管理系统
  • Android开机动画资源包制作(测试使用)
  • 积分抽奖功能
  • 软件功能设计视角下的能源管理系统功能清单构建与实践​
  • 整合 | 大模型时代:微调技术在医疗智能问答矩阵的实战应用20250427
  • Net版本Spire.doc 最新版去水印
  • 【CF】Day45——Codeforces Round 1021 (Div. 2) BC
  • NdrpPointerUnmarshallInternal函数分析之pFormatPointee指针的确定
  • Java学习-Java基础
  • Day23-Web开发——Linux
  • 18.电源滤波器的量化选型方法
  • 前端面试 js
  • 顺风车app订单系统框架设计
  • 第五届全国医院人文管理路演在昆山举办:患者体验才是温度计
  • 金融创新破局记:中小微企业转型背后的金融力量
  • 朝鲜派兵库尔斯克是否有助于解决乌克兰危机?外交部回应
  • 人社部:我国劳动力市场潜力足,韧性强
  • 钟声:美以芬太尼为借口滥施关税,纯属“内病外治”
  • 魔都眼丨人形机器人“华山论剑”:拳击赛缺席,足球赛抢镜