使⽤PLSQLDeveloper查看执⾏计划,及分析执⾏计划结果
⼀段SQL代码写好以后,可以通过查看SQL的执⾏计划,初步预测该SQL在运⾏时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执⾏计划,分析出该SQL代码的问题所在。
那么,作为开发⼈员,怎么样⽐较简单的利⽤执⾏计划评估SQL语句的性能呢?总结如下步骤供⼤家参考:
1、 打开熟悉的查看⼯具:PL/SQL Developer。
在PL/SQL Developer中写好⼀段SQL代码后,按F5,PL/SQL Developer会⾃动打开执⾏计划窗⼝,显⽰该SQL的执⾏计划。
2、 查看总COST,获得资源耗费的总体印象
⼀般⽽⾔,执⾏计划第⼀⾏所对应的COST(即成本耗费)值,反应了运⾏这段SQL的总体估计成本,单看这个总成本没有实际意义,但可以拿它与相同逻辑不同执⾏计划的SQL的总体COST进⾏⽐较,通常COST低的执⾏计划要好⼀些。
3、 按照从左⾄右,从上⾄下的⽅法,了解执⾏计划的执⾏步骤
执⾏计划按照层次逐步缩进,从左⾄右看,缩进最多的那⼀步,最先执⾏,如果缩进量相同,则按照从上⽽下的⽅法判断执⾏顺序,可粗略认为上⾯的步骤优先执⾏。每⼀个执⾏步骤都有对应的COST,可从单步COST的⾼低,以及单步的估计结果集(对应ROWS/基数),来分析表的访问⽅式,连接顺序以及连接⽅式是否合理。
4、 分析表的访问⽅式
表的访问⽅式主要是两种:全表扫描(TABLE ACCESS FULL)和索引扫描(INDEX SCAN),如果表上存在选择性很好的索引,却⾛了全表扫描,⽽且是⼤表的全表扫描,就说明表的访问⽅式可能存在问题;若⼤表上没有合适的索引⽽⾛了全表扫描,就需要分析能否建⽴索引,或者是否能选择更合适的表连接⽅式和连接顺序以提⾼效率。
5、 分析表的连接⽅式和连接顺序
表的连接顺序:就是以哪张表作为驱动表来连接其他表的先后访问顺序。
表的连接⽅式:简单来讲,就是两个表获得满⾜条件的数据时的连接过程。主要有三种表连接⽅式,嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序-合并连接(SORT MERGE JOIN)。我们常见得是嵌套循环和哈希连接。
sqldeveloper安装步骤
嵌套循环:最适⽤也是最简单的连接⽅式。类似于⽤两层循环处理两个游标,外层游标称作驱动表,检索驱动表的数据,⼀条⼀条的代⼊内层游标,查满⾜WHERE条件的所有数据,因此内层游标表中可⽤索引的选择性越好,嵌套循环连接的性能就越⾼。
哈希连接:先将驱动表的数据按照条件字段以散列的⽅式放⼊内存,然后在内存中匹配满⾜条件的⾏。哈希连接需要有合适的内存,⽽且必须在CBO优化模式下,连接两表的WHERE条件有等号的情况下才可以使⽤。哈希连接在表的数据量较⼤,表中没有合适的索引可⽤时⽐嵌套循环的效率要⾼。
6、 请核⼼技术组协助分析  www.2cto
以上步骤可以协助我们初步分析SQL性能问题,如果遇到连接表太多,执⾏计划过于复杂,可联系核⼼技术组共同讨论,⼀起寻更合适的SQL写法或更恰当的索引建⽴⽅法
总结两点:
1、这⾥看到的执⾏计划,只是SQL运⾏前可能的执⾏⽅式,实际运⾏时可能因为软硬件环境的不同,⽽有所改变,⽽且cost⾼的执⾏计划,不⼀定在实际运⾏起来,速度就⼀定差,我们平时需要结合执⾏计划,和实际测试的运⾏时间,来确定⼀个执⾏计划的好坏。
2、对于表的连接顺序,多数情况下使⽤的是嵌套循环,尤其是在索引可⽤性好的情况下,使⽤嵌套循
环式最好的,但当ORACLE发现需要访问的数据表较⼤,索引的成本较⾼或者没有合适的索引可⽤时,会考虑使⽤哈希连接,以提⾼效率。排序合并连接的性能最差,但在存在排序需求,或者存在⾮等值连接⽆法使⽤哈希连接的情况下,排序合并的效率,也可能⽐哈希连接或嵌套循环要好。
附I:⼏种主要表连接的⽐较
通过F5查看到的执⾏计划,其实是pl/sql developer⼯具内部执⾏查询 plan_table表然后格式化的结果。
select * from plan_table where statement_id='...'。其中
Description列描述当前的数据库操作,
Object owner列表⽰对象所属⽤户,
Object name表⽰操作的对象,
Cost列表⽰当前操作的代价(消耗),这个列基本上就是评价SQL语句的优劣,
Cardinality列表⽰操作影响的⾏数,
Bytes列表⽰字节数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。