Oracle的执行计划查看方法

Oracle的执行计划查看方法

Oracle在执行一个SQL之前,首先需要看一下SQL的执行计划,然后在按照执行计划执行SQL,分析执行计划的工作是由优化器来执行的,在不同的条件下,一个SQL可能存在多条执行计划,但是在某个特定的时间点,特定的环境下,一定只有一种执行计划是最优的。

1、 Oracle的优化方式

Oracle有两种优化方式:RBO(Rule-Based Optimization)和CBO(Cost-Based Optimization)

RBO: 优化器在分析SQL语句的时候所遵循的优化规则是基于Oracle内部预定的一些规则。

CBO: 优化器字分析SQL语句的时候主要是看语句执行的开销(Cost),这里的代价主要指CPU和内存,优化器在判断是否使用这种方式的时候,主要参照的是表及索引的统计信息。统计信息给出表的大小,有多少行,每行的长度等信息。

2、 优化器的优化模式

优化模式包括:Rule, Choose, First Rows, All Rows四种模式。

Rule:走基于规则的模式。

Choose:默认情况下Oracle使用这种优化模式,当一个表或索引有统计信息的时候,走CBO的方式;如果表或索引没有统计信息,表又不是特别的小,且相应的字段有索引,则走RBO的方式。在缺省情况下,ORACLE采取Choose的优化模式,为了避免不必要的Full Table Scan,尽量避免采取此种优化模式,而直接采取CBO或者RBO的优化模式。

First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。

All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。

需要注意的是:First Rows和All Rows是有冲突的。

3、 使用pl/sql查看执行计划

下面以MERP系统中的调度计划日志表为例来说明如何使用pl/sql查看oracle的执行计划。

1、启动pl/sql,打开相应的数据库表,如图1所示,表中总共有67704条数据:

图 1 打开调度计划日制表

这个表里面有一个字段叫做Input_time,存储的是调度计划日志被写入数据库表中的时间,默认情况下这个字段没有建立索引,因此建立如下SQL语句:

select * from tb_merp_schedul_log t

where t.input_time <= to_date('yyyy-mm-dd hh24:mi:ss','2009-04-28 09:00:00')

2、按F5键查看上述SQL语句的执行计划,如图2所示:

图 2 执行计划界面

图2显示了上述SQL的执行计划,使用的是oracle默认的Choose优化模式,执行计划出现了Full Access Scan,cost为175,字节数为247350。需要注意的是cost越低越好,字节数越少越好。

3、给条件input_time字段增加索引,再次查看执行计划,如图3所示:

图 3 索引被用上了

没有出现Full Access Scan,出现了 INDEX RANGE SCAN,并且可以看出使用到的索引为INDEX_INSERT_DATE, cost为97,接近原来cost的一半.

4、 用不上索引的情况:

1、 not、<>、与null值比较这几种情况使用不上索引;

2、 like 通配符只是出现在后面能够用上索引( like ‘luo%’),通配符出现在前面用不上索引(like ‘%jun’);

3、 索引列的选择性不高的时候也用不上索引,例如一个表有个字段只有四种可能的值,数据表中有100万条记录,如果在这个只有四种可能的值的字段上面建立索引也不会使用到。

4、 索引列是否是函数的参数,如果是,则使用不上,对于上面的sq如果写成下面的形式则也使用不上索引:

select * from tb_merp_schedul_log t

where to_char (t.input_time,'yyyy-mm-dd hh24:mi:ss') <= '2009-04-28 09:00:00'

5、还存在一些其他的情形不能用上索引,不能一一说明。

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4