目录
环境
文档用途
详细信息

环境
系统平台:N/A
版本:6.0,4.5.2,5.6.5,4.3.4.9
文档用途
本文主要用于介绍如何通过explain命令查看SQL的详细执行计划。

详细信息
一、explain命令详解

1、语法

EXPLAIN [ ( option [, ...] ) ] statementEXPLAIN [ ANALYZE ] [ VERBOSE ] statemen

2、选项说明

option可以有以下选项

analyze:执行语句并显示真正的运行时间和其它统计信息,会真正执行SQL语句;

verbose:显示额外的信息,尤其是计划树中每个节点的字段列表,schema识别表和函数名称。总是打印统计数据中显示的每个触发器的名字;

costs:包括每个计划节点的启动成本预估和总成本的消耗,也包括行数和行宽度的预估;

buffers:使用信息,特别包括共享块命中、读、脏和写的次数,本地块命中、读、脏和写,临时块读和写的次数;

timing:在输出中包含实际启动时间和每个节点花费的时间,重复读系统块在某些系统上会显著的减缓查询的速度,只在ANALYZE也启用的时候使用;

format:声明输出格式,可以为TEXT、XML、JSON 或 YAML,默认 text;

二、explain输出详解

1、计划解读

a=> explain analyze select * from pgbench_accounts ;QUERY PLANSeq Scan on pgbench_accounts  (cost=0.00..2688.00 rows=100000 width=97) (actual time=0.267..34.302 rows=100000 loops=1)Planning Time: 0.165 msExecution Time: 46.280 ms

cost=0.00…2688.00,0.00代表启动成本;2688.00代表返回所有数据的成本;rows=100000表示返回多少行;width=97,表示每行平均宽度(以字节计算);actual time=0.267…34.302,实际花费的时间;loops=1,循环的次数;

Planning Time,生成执行计划的时间;

Execution Time,执行执行计划的时间。

2、输出参数详细说明

cost:第一个数字表示启动的成本,也就是返回第一行需要多少cost值;第二个数字表示返回所有的数据的成本。默认cost值如下

顺序扫描一个数据块,cost值定为1

随机扫描一个数据块,cost值定为4

处理一个数据行的 CPU,cost为0.01

处理一个索引行的 CPU,cost为0.005

每个操作符的CPU代价为0.0025

rows:表示会返回多少行

width:表示每行平均宽度为多少字节

buffers

shared hit:表示在共享内存中直接读到 多少个块,

read:表示从磁盘读了多少块

written:写磁盘多少块

执行计划含义
Seq Scan:全表扫描

Index Scan:索引扫描

Bitmap Heap Scan:位图扫描

Filter:条件过滤

Nestloop Join:嵌套循环连接,是在两个表做连接时,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大,要把返回子集较小的表作为外表,而且在内表的连接字段上要有索引,否则会很慢。执行过程:

确定一个驱动表(outer table),另一个表为inner table

驱动表中的每一行与inner 表中的相应记录 JOIN 类似一个嵌套的循环

Hash Join:使用两个表中较小的表,并利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。适用于较小的表可以完全放入内存中的情况。如果表很大,不能完全放入内存,优化器会将它分割成若干不同的分区,把不能放入内存的部分写入磁盘的临时段。

Merge Join:如果源数据上有索引,或者结果已经被排过序,在执行排序合并连接时就不需要排序了,Merge Join 的性能会优于散列连接。

3、解读原则

①从下往上读
②从右至左读
③开启时间消耗是输出开始前的时间例如排序的时间
④消耗包括磁盘检索页,cpu时间
⑤注意,每一步的cost包括上一步的

⑥重要的是,explain 不是真正的执行一次查询 只是得到查询执行的计划和估计的花费

4、其他举例说明

下面是一个hash,hash join例子:

=# EXPLAIN SELECT relname, nspname FROM pg_class JOIN pg_namespace ON (pg_class.relnamespace=pg_namespace.oid);
QUERY PLAN
------------------------------------------------------------------------
Hash Join (cost=1.06..10.71 rows=186 width=128)Hash Cond: ("outer".relnamespace = "inner".oid)-> Seq Scan on pg_class (cost=0.00..6.86 rows=186 width=68)-> Hash (cost=1.05..1.05 rows=5 width=68)-> Seq Scan on pg_namespace (cost=0.00..1.05 rows=5 width=68)
两个表间INNER JOIN和LEFT OUTER JOIN 连接的时候,这个运算是很常用的。这个运算是先把外表中关联条件部分做一个哈希表,然后去和内部表关联。

首先在表pg_namespace上做了一次顺序扫描,之后进行hash运算形成一个hash表,之后再pg_class表上进行顺序扫描,再进行hash join操作,hash join操作的条件为"outer".relnamespace = “inner”.oid。

如何查看SQL的执行计划相关推荐

  1. Oracle 查看sql语句执行计划方法

    注意这篇文章只介绍查看sql语句执行计划的方法, 并不是说明如何看懂执行计划. 一般来讲, 直接在sqlplus 执行 set autotrace on; 就可以了 其前提是登陆用户必须有视图  v_ ...

  2. expain 查看SQL的执行计划

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  3. Mysql学会查看sql的执行计划

    什么是执行计划? 首先在Mysql的服务中有连接器.查询缓存(Mysql8 已经删除).分析器.优化器.执行器等,所有跨存储引擎的功能都在这一层实现 而一条sql怎么执行是由优化器决定的, 优化器分为 ...

  4. SQL Server执行计划那些事儿(3)——书签查找

    接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...

  5. DRDS分布式SQL引擎—执行计划介绍

    摘要: 本文着重介绍 DRDS 执行计划中各个操作符的含义,以便用户通过查询计划了解 SQL 执行流程,从而有针对性的调优 SQL. DRDS分布式SQL引擎 - 执行计划介绍 前言 数据库系统中,执 ...

  6. SQL Server执行计划面试问题

    In this article, we will discuss a few very common questions that you may be asked during a SQL Serv ...

  7. SQL Server如何查看存储过程的执行计划

    有时候,我们需要查看存储过程的执行计划,那么我们有什么方式获取存储过程的历史执行计划或当前的执行计划呢? 下面总结一下获取存储过程的执行计划的方法. 1:我们可以通过下面脚本查看存储过程的执行计划,但 ...

  8. mysql查看执行计划_MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...

  9. explain如何查看mysql_MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...

  10. SQL Server 执行计划缓存

    原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储 ...

最新文章

  1. 【Sql Server】DateBase-SQL调整
  2. PYTHON自动化Day12-unittest自动注册登录
  3. 快排堆排归排三种排序的比较
  4. iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化
  5. GetCurrentProcessID、OpenProcessToken、LookupPrivilegeValue、AdjustTokenPrivileges
  6. elasticsearch in查询_Python Elasticsearch DSL 查询、过滤、聚合操作实例
  7. IT职场人生系列之四:怎样写简历
  8. java注释修改_java – 使用注释修改方法
  9. php添加gd库,linux下为php添加GD库(重新编译php)
  10. 中小学计算机听课记录表,小学数学听课记录范文表格
  11. C++--第12课 - 操作符重载 - 上
  12. MultipartFile多文件上传
  13. Java后台获取Cookie
  14. mysql是个单用户数据库_MySQL是一个支持单用户的数据库管理系统 答案:×
  15. 阿里云服务器买完不知道如何使用(新手入门教程)
  16. 用Python写个「倒计时」软件
  17. SPLAYER中文字幕乱码
  18. SQL Server使用SUM(求和)函数
  19. Buuctf 佛系青年
  20. Unity限制InputField输入数字

热门文章

  1. 光伏电池matlab/simulink 搭建模型 可应用于光伏发电最大功率点跟踪 mppt中
  2. MSagent 学习笔记
  3. 复杂网络理论及其应用-基本概念
  4. 机械系统传动创新组合设计实验台,QY-JXSX08
  5. 使用 GalleryView 1.1制作相册说明
  6. Tapestry5的喜爱.
  7. 《Android框架揭秘》读书笔记--在Java中调用C库函数
  8. nodejs项目实例医生预约平台宠物医院预约挂号网
  9. Nebula Graph安装
  10. u盘读写速度变慢了开始快后面特别慢卡顿解决方法