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

【精】获取执行计划

最帅dba工作笔记 2018-07-16
1017

获取数据库的执行计划:
在我们进行数据库sql优化的时候,我们为了判定数据sql语句的执行效率,我们需要通过执行计划去判断当前SQL语句在数据库当中的执行效率是如何的。什么是执行计划?我们写的sql语句都是我们程序员能够理解的一些语句,但是在数据库当中,sql语句会被解析成数据库的执行语言和执行顺序。那么这个就是我们的执行计划。ORACLE为了SQL执行的性能提升,所以在每次执行完一条SQL语句后会缓存到share pool当中的library cache当中,以便提高下次执行性能。

我这篇文章里不分析如何去看执行计划,下章分析。

具体的方法大概有这么几种我们挨个说说:

  1. set autotrace on/traceonly/off

我们这种方法是比较常用的,我们经常会从awr报告当中抓一个sql语句在连接的绘画当中执行一次,我们就可以直观的看到这个语句的执行计划。

on会执行sql语句并且显示执行结果,traceonly不显示执行sql语句后的结果。

这种方法可以直观的看到当前sql语句的执行计划和一些统计信息。

但是唯一一点麻烦的是,他会等待sql语句执行之后才能显示

  1. explain plan for 获取

这种方法是将SQL的执行计划解析到DBMS_XPLAN包当中,我们想要查看SQL的执行计划就需要访问

这个包;

我们可以看到当前的执行计划已经出现了,但是这种方法没有统计信息,这是唯一的缺点

多嘴:

这里我们可以看到在最下方有note的信息,dynamic sampling used for this statement (level=2);

这是动态采样,我们在执行这个sql语句的时候,会将这两个表的信息动态采样。这个值如果在大数据量的情况下可能是不准确的,因为cbo会将有限的块进行估算,从而得出估算的行数。

当然通过这个包还有一种方法去查看执行计划,那就是dbms_xplan.display_cursor,我们从名字上就能看出来,通过游标信息查看执行计划。这个一般情况下是知道我们的sqlid,从共享池当中得到执行计划。

还可以通过dbms_xplan.display_awr('sqlid')获取,这是通过awr性能视图当中读取。

  1. statistic_level=all

statistic_level 参数分为3个等级:all, typical,basic,起作用是控制收集统计信息的粒度

basic是关闭所有的性能数据的收集,all开启所有的收集,typical是除了plan_execurtetion_statistics和os statisitics不收集其他的都会收集,oracle默认的是typical。我们先将这个改成all;

alter session statistic_level=all;

我们执行一条sql语句。

select * from dept t1,emp t1 where t1.deptno=t2.deptno;

我们查询最后一次的状态。

我们发现这个显示的格式和我们之前的格式有所区别。

starts:sql执行次数。

e-rows:执行计划预计的次数。

a-rows:实际返回的行数。对比e-rows和a-rows可以看出执行计划出现了问题。

a-time:每一步执行的时间。

buffer:每一步的逻辑读。

0mem,1mem,used-mem 是内存评估值,0mem是cbo最有执行模式所以需要的内存评估值。1mem是cbo one-passde 内存评估值。used-mem是消耗内存。

当然如果不更改这个参数,可以使用hint的方式,效果是一样的。

select *+ gather_plan_statistics */ * from dept t1,emp t2 where t1.deptno=t2.deptno;

很直观的看出来表被访问了多少次,但是缺点是没法看出物理读的大小。

  1. 通过awrsqrpt.sql

通过输入snap断点和sqlid,显示的结果简单易懂。

THAT'S ALL

BY CUI PEACE!!!



本文分享自微信公众号 - 最帅dba工作笔记,如有侵权,请联系 service001@enmotech.com 删除。
最后修改时间:2019-12-18 15:36:15
文章转载自最帅dba工作笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论