一般说来,ORACLE中SQL的优化,在很大程度上是对执行计划的调整,因而学会如何查看执行计划就显得尤为重要。在ORACLE数据库中,我们通常有以下几种方法得到目标SQL的执行计划:
(1)使用explain plan命令;
(2)使用DBMS_XPLAN包;
(3)SQLPLUS中的AUTOTRACE开关
(4) 10046事件
(5)10053事件
(6)AWR报告或者Statsoack报告
(7)一些现成的脚本(如display_cursor_9i.sql)
一,explain plan命令
对于初学者来说,一般在得到sql执行计划的时候,往往会直接在PL/SQL Developver中直接使用快捷键F5,我开始也是这么做的。
实际上,当你按下快捷键F5的时候,PL/SQL Developer就调用了explain plan命令,按快捷键F5只不过是对explain plan命令上进行的一层封装而已。
explain plan 命令的语法是依次执行如下两条命令:
explain plan for +目标 SQL
select * from table(dbms_xplan.display);
二,使用DBMS_XPLAN包
使用DBMS_PLAN 包中的方法是在ORACLE数据库中得到目标SQL的第二种方法,针对不同的应用场景,你可以选择如下四种方法的一种:
1.select * from table(dbms_xplan.display);
2.select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
3.select * from table(dbms_xplan.display_cursor('sql_id/hash value',child_cursor_number,'advanced'));
4.select * from table(dbms_xplan.display_awr('sql_id‘));
方法1本质上就是和方法一是一样的,在这里不再说明。
方法2用于SQLPLUS中查看刚刚执行过的SQL的执行计划,直接跟在刚执行过的SQL 语句后面执行一遍就好。 dbms_xplan.display_cursor中的前两个参数都是null,第三个参数有两种选择,一种是‘all’,一种是‘advanced’,只不过‘advanced’的显示结果会比‘all’的结果更详细些。
方法3用于查看指定SQL的执行计划,这里针对dbms_xplan.display_cursor中有传入三个参数,第一个参数为目标sql的sql_id或者hash valune,第二个参数是查看执行计划所传入的Child_Cursor_Number,第三个参数在方法2中已经说明了,具体语法如下:
select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like' 目标SQL部分语句%‘
从中可以得到sql_id,hash_value,child_number,然后把这些代入对应的语句中,就可以得到指定SQL的执行计划。只要目标SQL的执行计划所在的Child Cursor还没有被age out出share pool,就可以使用方法3来得到该SQL的执行计划。
方法4用于查看指定sql的所有历史执行计划,使用方法2,3的前提条件是该sql的执行计划还在Share Pool中,而如果该SQL的执行计划已经被age out出Share Pool,那么只要该SQL的执行计划被Oracle采集到AWR Repository中,我们就可以用方法4来查看该sql所有的历史执行计划。
由于时间原因,下篇继续
,