首页 > Oracle > Oracle 查看真实的执行计划-简单的执行计划解析!
2014
01-20

Oracle 查看真实的执行计划-简单的执行计划解析!

Oracle中查询执行计划的方法比较多,这里介绍一下我比较常用的几种查看方式。

查看执行计划方法一:利用AUTOTRACE查看执行计划
注意:AUTOTRACE 所查询的执行计划并不是真实的执行计划,是CBO预估的。是通过查询plan_table统计出来的执行计划。

如果查看方法会一并输出结果,可以使用set autot trace,只显示执行计划和统计信息。这里说明一下recursive calls递归参数,这个一般会在sql第一次执行,或者sql里面有自定义函数的时候会出现,所以一般在sql中,尽量避免出现自定义函数的情况。

 

查看执行计划方法二: 第一步:EXPLAIN PLAN FOR SQL_TEXT;
第二步:显示普通执行计划:SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 或者显示高级执行计划:SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(FORMAT=>’ADVANCED -PROJECTION’));    —这种方法查询出来的执行计划也不是真实的

 

查看执行计划方法三:显示特殊的执行计划(真实的执行计划) ,这种执行计划收集时间比较久

SELECT /*+ GATHER_PLAN_STATISTICS */ ….
OR
ALTER SESSION SET STATISTICS_LEVEL=ALL; —再运行查询SQL

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,’ALLSTATS LAST’));

 

查看执行计划方法四:显示真实的执行计划

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘SQL_ID’,SQL_CHILD_NUMBER));

 

查看执行计划方法五:通过display_awr,v$sql_plan等,当然还有其他很多办法,但用得比较多是就目前上面这几种。


下面我们来阅读一个简单的执行计划:

首先看到如上执行计划,id=4和id=5处,前面都有一个星号,这里说明下面有谓词信息过滤,可以看到id=5处是全表扫描,且有谓词条件过滤,如果是一个小表就可以不用管了,如果是一个大表,可能这里就有问题,需要根据谓词条件信息count的条数和全表count的条数,如果过滤的条数很少,可能就需要建立索引来优化,如果过滤的条数很多,那可能全表扫描比索引扫描更快。

我们再来另一个执行计划:

注意看这个执行计划id=1这一部分,这里的意思是回表,当然这里测试表没有多少数据,如果id=1这一部分返回10W条数据,然后过滤后只有1000条数据,也就是说,在回表之后才过滤这9W多条数据,在这个执行计划中,通过IDX索引扫描返回17条数据(object_id=10过滤之后),然后通过回表过滤之后得到9条数据(object_name=scott过滤之后),如果索引返回的数据非常大且回表过滤之后数据非常少,这时也考虑建立组合索引,object_id和object_name的组合索引解决回表过滤大数据的问题。当然如果回表之后数据还是很多,那也没必要建立组合索引。

这里只说明2个简单的例子,实际开发的环境中,执行计划要复杂很多,这里先不罗列出来说明了。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL