暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库 | SQL语句执行计划

338

如何发现最消耗系统资源的SQL语句呢? 利用I/O优化鉴定耗费资源的方法即AWR报告,即可使之变得很容易

当确定了一个最有可能出问题的 SQL 语句后,接下来就是如何追踪这一语句的执行,最普遍的方法就是找出该SQL语句的执行计划


那么执行计划又是什么呢?

简言之,一个执行计划就是在执行一条SQL语句和相关的操作时,优化器所执行的操作步骤。

一个执行计划包括了该语句须访问的每一个表的访问方法以及访问这些表的顺序。

观察执行计划本身已经清楚地解释,为什么这个语句效率如此之低。

下来简单介绍几种常用而简单易学的获取SQL语句执行计划的方法。


01

 利用autotrace追踪SQL语句


利用autotrace追踪SQL语句的代码如下:


SQL> set autotrace on
SQL> select * from dual;

D
-
X

执行计划
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT |    |     1 | 2 |     2   (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL |     1 | 2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        547  bytes sent via SQL*Net to client
        381  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


执行完语句后,会显示执行计划与统计信息。

在用该方法查看执行时间较长的SQL语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大的增加了,如果不想执行语句,而只是想得到执行计划,可以采用如下命令。


SQL> select * from dual;

执行计划
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT |    |     1 | 2 |     2   (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL |     1 | 2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        547  bytes sent via SQL*Net to client
        381  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


上述的代码只列出了执行计划,而不会真正地执行语句,这就大大优化了时间,虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息是没有用处的。

也可以使用如下指令单纯地显示执行计划。


SQL> set autotrace traceonly explain
SQL> select * from dual;

执行计划
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT |    |     1 | 2 |     2   (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL |     1 | 2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------


当然也可以只显示统计信息,代码如下。


SQL> set autotrace traceonly statistics;
SQL> select * from dual;

统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        547  bytes sent via SQL*Net to client
        380  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


追踪完毕SQL语句之后,可以使用如下命令关闭自动追踪功能。


SQL> set autotrace off
SQL> show autotrace
autotrace OFF


02

利用explain plan命令


explain plan命令被用来产生一个优化器所使用的执行计划。

这一命令将所产生的执行计划存储在一个表中,系统默认为表plan中,但是该命令并不真正的执行语句,而只是产生可能使用的执行计划。

如果仔细地观察这一执行计划,就可以了解到服务器是如何执行所解释的SQL语句。

expain plan命令的语法如下:

explainplansetstatement_id= '正文 '
into用户名.表名
for语句


其中,正文表示为语句的标示符是一个可选项。用户名.表名表示存放执行计划的表名,默认为plan table,这也是一个可选项。语句表示要解释的SQL语句正文。


03

参考书籍


Oracle数据库系统管理与运维-微课视频版

ISBN:9787302566106

作者:张立杰 主编 陈恒 陶永鹏 副主编

定价:69.9元


本书从Oracle数据库系统、管理以及运维的角度深入浅出地加以介绍,对于Oracle初学者以及Oracle相关从业人员都是适用的。本书的所有例题以及实验都是在最新的Oracle 19c版本下运行实验的。


内容简介


全书共15个章节,包括Oracle系统、管理以及运维相关知识,内容包括oracle体系结构、数据库实例、存储结构、数据字典与动态性能视图、Oracle监控、数据库备份、数据库恢复、闪回技术以及数据库优化等;包括20个完整的项目案例。书中案例侧重应用性、趣味性强、分布合理、通俗易懂,使读者能够快速掌握Oracle系统、管理以及运维方面的的基础知识、方法、工具以及技巧。



作者简介



张立杰

张立杰,硕士,副教授。研究方向为数据库、大数据。在各级学术期刊上发表论文10余篇,其中EI检索论文3篇,SCI检索论文1篇,计算机中文核心论文2篇。主持并完成省级项目3项;大连外国语大学校级教改项目4项、科研项目1项、校级开放课程一门。主编相关教材3部。从事Oracle专业教学十多年,为企事业员工,校企合作组织进行多次Oracle培训与讲座;受聘于Oracle Academy进行全球教师培训。


教学资源


本书附有教学视频、课件、教学大纲、电子教案、教学日历、习题答案、案例源码等配套资源,可以作为大学计算机及相关专业的教材,也可以作为Oracle技术的培训教材。



04

精彩推荐



文章转载自清华计算机学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论