oracle执行计划获取的几种方式(一)

2014-11-24 16:18:20 · 作者: · 浏览: 7
oracle执行计划获取的几种方式
1.set autotrace on
相信这种方法是最简单的,也是最常用的一样方法,这种方法经常用到分析一条SQL,这里贴出语法,很简单
SQL> set autotrace
Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
举例:

SQL> set autot on
SQL> select count(*) from plan_table;

COUNT(*)
----------
68
Execution Plan
----------------------------------------------------------
Plan hash value: 1751138260

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| PLAN_TABLE$ | 68 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------

Note
-----
- dynamic sampling used for this statement


Statistics
----------------------------------------------------------
27 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
515 bytes sent via SQL*Net to client
487 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
主要看consistent gets和physical reads,consistent gets是内存消耗,physical reads是磁盘的消耗,单位就是数据块。其他指标为辅。如果不需要列出语句的结果,那么 set autotrace traceonly即可。
2.explain plan for

举例:
SQL> explain plan for select * from book_info;
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3200443156

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1363 | 177K| 9 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| BOOK_INFO | 1363 | 177K| 9 (0)| 00:00:01 |
-------------------------------------------------------------------------------
当然以上这个是最简单的使用,explain是DML语句,并不是隐式提交。
statment_id指定了需要为那些SQL语句提供执行计划的标识
id指定一个名字,区分执行计划表中的多个执行计划
table指定了计划表的表名,默认是plan_table
这里注意一点,在9i中plan_table是普通表,10g中是同义词,可以通过数据字典查看。
@ /rdbms/admin/utlxplan可以创建计划表
@ /rdbms/admin/utlxpls也可以 阅读执行计划表,和上面调用dbms_xplan.display是一样的。
@ /rdbms/admin/utlxplp查看并行处理的信息。
不过这里看不到一致性读和物理读等,看不到IO的统计信息,不过这个在10g以后可以通过display_cursor可以看了。
这里还要注意变量的替换问题:
比如在一个PL/SQL中:select * from tab1 where name=p_value;
那么想要查看这个执行计划的话,千万不要用常量去替换,用select * from tab1 where name=:p_value即可。
通过statsment_id查看执行计划:
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1409354130

----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------