awrsqrpt.sql

这里给大家介绍另外一种方法這种方法可以很方便和AWR报告相结合。对于在生成的AWR报告中被发现的消耗资源较多的L语句我们可以使用AWR提供的/519536/viewspace-673950/,如需转载请注明出处,否则将追究法律责任

解决方式很多了也就是要走NESTED LOOPS+index, 既嘫8168很大,那么我们就让优化器知道TABLE函数返回的行少点才百行左右。

以下些都可以当然也可以使用hint:use_nl等

因为L的SELECT部分只访问B,全部来自于TABLE函數所以改写为子查询就可以了,使用子查询自然distinct也就没有必要了,因为是semi join(半连接)

一个占72%的应用,我们提升几十倍后那对系统性能明显是极好的。最终在执行次数增加50%的情况下,w4sd08pa主机CPU使用率由原来的高峰期平均47%的使用率降低为23%

这个问题能够解决有两个方面:

1、猜测并测试优化器的限制(table函数固定返回行8168);2、实际返回的行200-300。两者缺一不可如果实际返回的行就是几千上万,那么单纯通过优化L,吔是无法取得良好效果的

扫描文末二维码,关注DBA+社群微信公众号(dbaplus)可下载DBA+社群技术沙龙、OOW大会、2015GOPS、DCon2015等技术盛典PPT。

执行计划就是L调优嘚核心上面的L也是通过看到执行计划走HASH JOIN可能有问题出发的。

那么首先要搞定2个问题:

1、如何获取我要的执行计划(准确的计划);

2、怎麼看懂并找出执行计划里的问题

4.1 如何获取准确的执行计划

获取L执行计划的方式:

真实计划,需要用TKPROF工具解析

研究执行计划产生的原因

大镓一般怎么获取执行计划我一般用的较多的是dbms_xplan.display_cursor,优点很明显:1、获取的是真实执行的计划;2、多种参数还可以获取绑定变量的值方便驗证。

10053是检查优化器行为的实在搞不懂为什么走那个计划可以看看,用得较少

10046可以检查一些等待事件的内容,也可以获取绑定变量┅般用得也比较少。

set autotrace traceonly或者explain,他们的执行计划是同一来源记住,都来自plan_table是估算的,可能不是真实执行的计划可能是不准的。

所以你看嘚不对劲了,就得质疑它的准确性autotrace traceonly的好处是可以看到一致性读,物理读返回行等,这是真实的因为可以用一致性读,物理读来验证優化效果

其他的比如awrrpt等都可以获取执行计划,不过我很少用特别是pl developer这种工具,F5看计划我几乎是不用的,他也是plan table里的估算计划如果佷长,那无法分析

好处很明显,能够看到执行计划每步的E-ROWS(估算的行),A-ROWS(真实的行),STARTS,BUFFER GETSA-TIME(真实的执行时间)等信息。。我们通过对比估算的与真实的差距可以判断哪些表统计信息可能有问题,执行计划是不是走错了省的我们自己根据谓词去计算这步导致返回多少行。

注意一点如果一L执行很长时间,通过上面的方式来看计划我们是可以终止的,比如执行2小时执行不玩的L一般我没有耐心,最多5分鍾我就终止。终止完通过display_cursor也是可以看出执行信息的。

比如某个步骤执行100万次我这条L才能执行完,要3小时才可以我5分钟执行了100次,峩终止了L我要看的就是一个比例情况可以通过这个比例来判断,哪个步骤耗的时间最长哪里大概有问题,然后解决

优化器很多限制嘚,比如刚才的TABLE函数固定返回8168或者算法限制.....很多不准的,如果算法算出来的与真实差别很大那可能就会导致问题。统计信息有时候也無法收集准确的比如直方图,就有很多问题所以12c的直方图多了几种....之前只有等高和等频直方图。

刚才的set statistics_level直接写会输出结果我们可以讓他不输出结果:

1、l内容放到文件中,前面加上set termout off (这样可以对输出结果不输出)

用这种东西看执行计划有时候很方便找出问题,否则我们洎己得手动根据每个步骤对应的谓词,自己写L去计算真实返回的行然后再来比较,用这个ORACLE全帮我们干好了。

一般怎么看执行计划呢

鼡光标大法,找到入口最先执行的,光标定位ID=0的然后一直缩进向下,如果被挡住了那么这部分就是入口了。

比如ID=10的继续索引就被ID=11嘚挡住了,所以第10步就是入口

找到入口后,反向光标来利用平行级别的最上最先执行,最右最先执行原则来看父操作与子操作的关系,移动光标即可

比如这里的第13步,我只需要定位光标在PARTITION这个P前面然后向上移动,立马就知道它的驱动表是ID=5的VIEW,因为他们是对齐的

然后看看之间的JOIN关系是不是有问题,返回的行估算等

执行计划最右最上最先执行规则,有个例外大家知道不?就是通过以上规则,是不正确的

比如这个ID=2的在前面,但是它事实上是被ID=3的驱动的也就是被emp_a驱动的,这违背了一般的执行计划顺序规则平时注意点就行叻,标量子查询谓词里会出现绑定变量比如这里的:B1,因为每次带一个值去驱动子查询

搞清楚执行计划怎么干,那么看执行计划看啥

2、看表的访问方式,走全表走索引

3、看有没有一些经常影响性能的操作,比如FILTER

不要太过于关注COSTCOST是估算的,大不一定就慢小不一定僦快……当然比如COST很小,rows返回的都是很小的很慢。那么我们可能得考虑统计信息是不是过旧问题。

统计信息很重要就说一个例子:

赱了索引,COST很小一切都很完美,但是AWR现实占80%的资源一般啥情况?单纯从L上看也就是这执行计划估计不对,自己测一下很慢。也就昰COST很小ROWS很小,走索引很完美的计划是错误的,那么很显然基本就是统计信息导致的了。

实际第4步走sendtime索引应该返回1689393行,但是执行计劃估算返回1行统计信息不准确,再次检查统计信息收集日期是5月前的

返回168万行,但是现有统计信息却让cbo认为是1行这差别也太大了。

repeat嘚好处是啥比如列有直方图,会给你保留列没有统计信息会按照for all columns size 1收集。。其他原来怎么收就怎么收

高效访问结构让L更快,这个不說了主要是建索引。如何建索引也是一个很复杂的问题说一点,一般复合索引等值查询条件频率高的,作为前导列较好因为直接訪问可能效率比>,<...等高,后者访问了还需要过滤

下面看下影响优化器的参数导致的性能问题。

这是10g执行计划一个视图是UNION ALL做的,全部走索引:

很显然我要检查,统计信息没有问题然后怎么干?看在11g里做优化器降级如何。

在11.2.0.4中使用optimizer_features_enable分别测试10.2.0.4和11.2.0.3均可谓词推入到视图中走索引那么问题就出现在11.2.0.4了,因为11.2.0.3都是可以的说明11.2.0.4对视图谓词推入算法有了改变。很多优化器的东西oracle都有参数控制的,除了参数还有各补对应的fix control。那么先检查补丁相关的

查到了各种开启关闭,没有用最后看10053,分析10053详细参看是否是BUG导致,还是优化器改进问题参数設置问题:

10053看到默认参数被关了,检查下大概和查询转换的两个参数:

都被关了,当然10.2.0.4和11.2.0.3被关了也是可以的

还看到基于CBO的查询转换失败,因为参数被关了OJPPD(10g那种方式)失效了……那当然走不了,JPPD是11g的也失效了。

基本知道执行计划如何看关注哪些就很有用了,不要太關注啥COST前面讲了11.2.0.3都可以到11.2.0.4不行了,那可能有2种原因:1、算法改了;2、BUG

当然基于正常的理解,视图谓词推荐ORACLE是必须支持的,也是不存茬问题的所以肯定有正规的解决方式。先看第2个 BUG按理说,这种常见的东西特别是这L不算复杂,ORACLE应该不会触发BUG当然,查询转换是存茬各种BUG的11.2.0,4少了很多MOS中搜一下,比如这个JPPD就有很多BUG,但是没有看到11.2.0.4对应的

通过这个判断,10.2.0.4那种OJPPD基于规则的查询转换不行了,也就是算法改变因为cost_base_query_transformation参数关了,应该走OJPPD的现在JPPD也走不了,因为参数被关了这个是基于成本的查询转换才可以。

所以这是由于算法更新导致的问题,要求必须按照ORACLE官方建议恢复对应查询转换参数默认值:在基于COST的查询转换部分,只能走JPPD(和OJPPD类似)ORACLE建议设置CBQT参数,基于COST查詢转换更准确

这个问题,但是发了SR老外也不知道,然后我发现这2个参数恢复默认值可以当然首先cbqt参数我认为肯定有关系,后面的u_bottomup是測试出来的。后来告诉老外,老外也认可算法改变导致的问题所以核心参数的默认值改变,是很危险的可能影响全局,如果这两個参数不恢复涉及数百条核心L就无法正常执行,也就是系统不具有可用性了

最后说一下,经常碰到的一个优化器缺陷:

当OR与semi join放在一起嘚时候会触发无法进行subquery unnest的问题,也就是可能会产生FILTER,导致L非常缓慢有的甚至几天,几十天也别想运行结束了

第5、6步执行92万多次,那肯萣慢了……问题就是有个FILTER……

FILTER类似循环在无法unnest子查询中存在,类似标量子查询那种走法谓词里也有绑定变量的东西。

他们唯一的好处僦是内部构建HASH 表如果匹配的重复值特别多,那么探测次数少效率好,但是大部分时候重复值不多,那么就是灾难了

对于这种优化器限制的一般就是得改写了,因为L结构决定无法走高效的执行计划。因为我这里虽然走了所以,但是执行次数太多如果执行次数少,到也无所谓

两个分支都走HASH JOIN,starts全部为1虽然全部是全表扫描,但是执行效率提升很明显执行时间从12s到7s,gets从222w到4.5w之后,是否还有优化空间

特别逻辑读少了很多。后续优化:

2)这么多全表扫描是否能够让一些可以走索引?当然这些是可以做到的,但是不是主要工作了这个案例告诉我们,优化器是有很多限制的不是万能的。

除了统计信息正确良好的L结构,能够让L正确进行查询转换正确的访问结构,如索引等……都是让L高效执行的前提条件复杂!=低效,简单!=高效让优化器理解,并且有合适的访问结构支持才是王道!

简单的L不是赽的保证,复杂的也不一定见得慢高效的执行计划才是最重要的,索引优化L最重要的就是让不好的执行计划变得好。

也就是从多个方媔入手最终达到我们的优化目标。

作者 | 胡佳伟:云和恩墨技术工程師有多年数据库优化经验,在一线执行过多个包括通信、保险等行业的优化项目

在 Oracle 的性能分析中,很多时候需要对 L 进行分析而最重偠的就是对执行计划的分析。在本次的分享中我主要介绍常用的查看 L 执行计划的方法。

AWR 报告是对数据库性能诊断最常用的方式同时 AWR L report 是展示AWR 负载信息中记录的关于 L 的相关信息的报告。

报告导入与导出的脚本同样在如上的路径里,为 awrextr、awrload本次不进行演示。

与 AWR 报告生成方法┅样首先登陆数据库:

报告会生成在当前目录中。

与 AWR 报告采集相同因为性能数据的记录是累计的值,所以两个 snap_id 间如果重启过数据库会報错如果在选择的 snap_id 间没有该条 L 的信息同样会报错。 

通常会用于问题诊断时对问题 L 的总体概况进行了解因为可以查看 L 的多个执行计划及各执行计划的执行统计信息。

优势:可以在报告中查看执行计划的执行统计信息;

劣势:需要生成报告;缺少执行计划的谓词信息;需要權限较高

Explain plan for 通常是想要知道某条 L 文本在数据库中的执行计划会使什么样。使用该方法的同时需要使用另一个函数 dbms_xplan.display()

使用方法是,在想要知噵执行计划的 L 文本前加上 explain plan for 然后执行。需要注意的是该条 L 不会实际执行,只是生成执行计划并保存到 PLAN_TABLE$ 中。然后用 dbms_xplan.display() 来查看

需要注意的昰,该方法是根据当前的 session 的参数来进行解析如果业务程序与当前会话的设置存在不同,很可能执行计划不同通常可用于验证自己的优囮方法是否会有效。比如在文本中添加了 hint可以通过该方法验证是否会奏效。

优势:不需实际执行L;使用方便

劣势:可能存在与实际执荇计划不符。

DBMS_XPLAN 是 ORACLE 提供的工具包如上边的方法中就使用了其中一个过程。接下来介绍其他几种常用方法

使用该函数可以查看在当前会话剛执行完毕的 L 的执行计划

在该方法中存在三个参数第一个参数为 l_id,第二个为 cursor_child_no第三个为 format。在如上的部分中前两个参数都为 null默认情况下,會显示当前会话最后执行的执行计划而 format 是选择执行计划的显示信息,通常使用显示最全的 ‘advanced’

优势:执行计划信息全面;

劣势:存在與业务执行计划不同的可能;

该方法可查看在数据库 shared pool 中还存在的执行计划信息。

该方法使用简单执行计划信息详细,通常用于问题刚刚發生或正在发生,通过该方法可获取较为详细的执行计划信息如果执行过后时间较长,执行计划存在被替出的可能

优势:信息全面;使用方法简便。

劣势:可能存在时间过长已不在 shared pool 中

使用该方法可以查看 AWR 信息中的信息,与 AWR 报告查看的执行计划基本一致但是无法看箌执行计划的详细统计信息。

使用改方法看到的执行计划与 AWR 报告中的是相同的但是因为没有时间限制,会显示所有的执行计划如果存茬多个执行计划,不好判断问题时段使用的是哪个执行计划

劣势:信息较少缺少谓词信息等。

该方法可以在当前 session 开启通过该方法可以查看在该 session 执行的所有 L 的执行计划及执行的消耗。

这是最简单的打开方法当打开后,所有执行过的 L 在执行结果后会显示该条 L 的执行计划,和资源消耗信息

如上显示,在该条 L 执行后首先返回了查询的数据,然后是该条 L 的执行计划最后是执行的信息。

使用该命令开启 autotrace 后该条 L 执行完毕后不会返回具体的结果信息,只会返回结果的数量同时接下来返回的与上个方法一至,返回执行计划和资源消耗信息

洳上显示该条 L 执行完毕后,未显示所有的结果而是只有返回的行数。接下来返回的内容与上个方法一至对于该种打开方法,可以在 L 需偠返回大量数据的情况下开启

使用该方法打开 autotrace,返回的内容里只有该条 L 的执行计划

从如上的返回结果可以看到,只返回了该条 L 的执行計划

使用该方法打开 autotrace,只会显示 L 的结果数量和资源的消耗量

优势:使用方法简单开启后自动;信息全面

劣势:存在与业务执行计划不哃的可能

10046事件是在对复杂 L 的问题诊断时会使用的方法。使用 10046 事件可以明确看到执行计划在每一步的资源消耗

打开格式化的文件即可查看詳细的各个步骤的消耗。

在 L 优化的时候通常是要对其他正 session 中正在运行的 L 进行分析在这种情况下,就需要对其他session开启10046 trace

关注公众号:数据囷云(OraNews)回复关键字获取

‘DBA04’,DBA 手记4 经典篇章电子书

‘PRELECTION’大讲堂讲师课程资料

我要回帖

更多关于 sql 的文章

 

随机推荐