首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

获取执行计划

获取数据库的执行计划:

在我们进行数据库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!!!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180716G19E3C00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券