如何查看sql sql执行计划划的历史变更

看sql执行计划划的时候从第一行開始向右下看,一直到最右边如果有并列的,那么先上再下如果没并列,右边的先执行

这是一个简单的SQL的sql执行计划划,这个sql执行计劃划告诉我们id=2的最先执行,然后是id=3的然后执行id=1的。

首先对test1进行一次全表扫描这一步返回rows=2,CPU的消耗为3接下来对test进行一次全表扫描,這一次返回的rows为1CPU的消耗为2。接下来对这两个结果进行一次哈希连接(hash join)返回rows=1,这里的CPU消耗为6但是需要注意,这次是我的语句赶寸了6=2X3,但是哈希连接需要的CPU COST绝对不会恰恰是之前执行的操作的CPU COST之积特别说明一下。至此我们的oracle对这个语句的sql执行计划划结束。

这里给大家介绍另外一种方法這种方法可以很方便和报告相结合。对于在生成的AWR报告中被发现的消耗资源较多的SQL语句我们可以使用AWR提供的awrsqrpt.sql脚本达到获取SQL语句sql执行计划劃的目的。1.下面是以获得SQL

2.小结在知道SQL Id的前提下我们可以使用Oracle自带的awrsqrpt.sql脚本快速的获得SQL语句的sql执行计划划信息(在上述中显示的信息不局限於此)。有兴趣的朋友可以调出awrsqrpt.sql脚本研究一下这个功能的实现过程.

一段SQL代码写好以后可以通过查看SQL的sql执行计划划,初步预测该SQL在运行时的性能好坏尤其是在发现某个SQL语句的效率较差时,我们可以通过查看sql执行计划划分析出该SQL代码嘚问题所在。 


那么作为开发人员,怎么样比较简单的利用sql执行计划划评估SQL语句的性能呢总结如下步骤供大家参考: 


2、 查看总COST,获得资源耗费的总体印象 

  一般而言sql执行计划划第一行所对应的COST(即成本耗费)值,反应了运行这段SQL的总体估计成本单看这个总成本没有实际意义,但可以拿它与相同逻辑不同sql执行计划划的SQL的总体COST进行比较通常COST低的sql执行计划划要好一些。


3、 按照从左至右从上至下的方法,了解sql执荇计划划的执行步骤 

sql执行计划划按照层次逐步缩进从左至右看,缩进最多的那一步最先执行,如果缩进量相同则按照从上而下的方法判断执行顺序,可粗略认为上面的步骤优先执行每一个执行步骤都有对应的COST,可从单步COST的高低,以及单步的估计结果集(对应ROWS/基数)來分析表的访问方式,连接顺序以及连接方式是否合理 


4、 分析表的访问方式 

  表的访问方式主要是两种:全表扫描(TABLE ACCESS FULL)和索引扫描(INDEX SCAN),如果表上存在选择性很好的索引却走了全表扫描,而且是大表的全表扫描就说明表的访问方式可能存在问题;若大表上没有合适的索引而赱了全表扫描,就需要分析能否建立索引或者是否能选择更合适的表连接方式和连接顺序以提高效率。


5、 分析表的连接方式和连接顺序 

  表的连接顺序:就是以哪张表作为驱动表来连接其他表的先后访问顺序 

表的连接方式:简单来讲,就是两个表获得满足条件的数据时的連接过程主要有三种表连接方式,嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序-合并连接(SORT MERGE JOIN)我们常见得是嵌套循环和哈希连接。 

嵌套循环:朂适用也是最简单的连接方式类似于用两层循环处理两个游标,外层游标称作驱动表

检索驱动表的数据,一条一条的代入内层游标查找满足WHERE条件的所有数据,因此内层游标表中可用索引的选择性越好嵌套循环连接的性能就越高。 

哈希连接:先将驱动表的数据按照条件字段以散列的方式放入内存然后在内存中匹配满足条件的行。哈希连接需要有合适的内存而且必须在CBO优化模式下,连接两表的WHERE条件囿等号的情况下才可以使用哈希连接在表的数据量较大,表中没有合适的索引可用时比嵌套循环的效率要高 

以上步骤可以协助我们初步分析SQL性能问题,如果遇到连接表太多sql执行计划划过于复杂,可联系核心技术组共同讨论一起寻找更合适的SQL写法或更恰当的索引建立方法 

1、这里看到的sql执行计划划,只是SQL运行前可能的执行方式实际运行时可能因为软硬件环境的不同,而有所改变而且cost高的sql执行计划划,不一定在实际运行起来速度就一定差,我们平时需要结合sql执行计划划和实际测试的运行时间,来确定一个sql执行计划划的好坏 

2、对於表的连接顺序,多数情况下使用的是嵌套循环尤其是在索引可用性好的情况下,使用嵌套循环式最好的但当ORACLE发现需要访问的数据表較大,索引的成本较高或者没有合适的索引可用时会考虑使用哈希连接,以提高效率排序合并连接的性能最差,但在存在排序需求戓者存在非等值连接无法使用哈希连接的情况下,排序合并的效率也可能比哈希连接或嵌套循环要好。 


附I:几种主要表连接的比较 

我要回帖

更多关于 sql执行计划 的文章

 

随机推荐