获取数据库的执行计划:
在我们进行数据库sql优化的时候,我们为了判定数据sql语句的执行效率,我们需要通过执行计划去判断当前SQL语句在数据库当中的执行效率是如何的。什么是执行计划?我们写的sql语句都是我们程序员能够理解的一些语句,但是在数据库当中,sql语句会被解析成数据库的执行语言和执行顺序。那么这个就是我们的执行计划。ORACLE为了SQL执行的性能提升,所以在每次执行完一条SQL语句后会缓存到share pool当中的library cache当中,以便提高下次执行性能。
我这篇文章里不分析如何去看执行计划,下章分析。
具体的方法大概有这么几种我们挨个说说:
set autotrace on/traceonly/off
我们这种方法是比较常用的,我们经常会从awr报告当中抓一个sql语句在连接的绘画当中执行一次,我们就可以直观的看到这个语句的执行计划。
on会执行sql语句并且显示执行结果,traceonly不显示执行sql语句后的结果。
这种方法可以直观的看到当前sql语句的执行计划和一些统计信息。
但是唯一一点麻烦的是,他会等待sql语句执行之后才能显示
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性能视图当中读取。
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;
很直观的看出来表被访问了多少次,但是缺点是没法看出物理读的大小。
通过awrsqrpt.sql
通过输入snap断点和sqlid,显示的结果简单易懂。
THAT'S ALL
BY CUI PEACE!!!
领取专属 10元无门槛券
私享最新 技术干货