oracle10g 查看SQL执行计划

oracle10g查看SQL执行计划有很多方法:

1.通过PL/SQL打开SQLWINDOW按F5可以看到执行计划,但是这里没有物理读等统计信息

[@more@]

2.使用dbms_xplan包,这里跟F5差不多,也是没有一些统计信息

Oracle9i新引入的包dbms_xplan
Oracle9i新引入的包dbms_xplan。函数display有三个参数:Table_name——执行计划所存放的表,默认为PLAN_TABLE;STATEMENT_ID——PLAN_TABLE表中的字段;FORMAT——显示格式。
SQL> explain plan for
2 select
3 tA.n2,
4 tB.n2
5 from
6 t1 tA,
7 t1 tB
8 where
9 tA.n1 = 15
10 and tB.n1 = tA.n1 11 ;

Explained. SQL> select * from table(dbms_xplan.display);

优点:适合于bind var的SQL。可以直接执行,能够根据相关信息排序,显示界面友好。

3.使用autotrace查看,可以查看一些统计信息

首先执行脚本
SQL>@D:oracleora92rdbmsadminutlxplan.sql 建立plan_table表
SQL> set autotrace on
SQL> set autotrace traceonly
SQL> select table_name from user_tables;

关于Autotrace几个常用选项的说明:
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询输出


已选择98行。
已用时间: 00: 00: 00.04
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 NESTED LOOPS
2 1 NESTED LOOPS (OUTER)
3 2 NESTED LOOPS (OUTER)
4 3 NESTED LOOPS (OUTER)
5 4 NESTED LOOPS (OUTER)
6 5 NESTED LOOPS
7 6 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
8 7 INDEX (RANGE SCAN) OF 'I_OBJ2' (UNIQUE)
9 6 TABLE ACCESS (CLUSTER) OF 'TAB$'
10 9 INDEX (UNIQUE SCAN) OF 'I_OBJ#' (NON-UNIQUE)
11 5 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
12 11 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
13 4 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
14 3 TABLE ACCESS (CLUSTER) OF 'USER$'
15 14 INDEX (UNIQUE SCAN) OF 'I_USER#' (NON-UNIQUE)
16 2 TABLE ACCESS (CLUSTER) OF 'SEG$'
17 16 INDEX (UNIQUE SCAN) OF 'I_FILE#_BLOCK#' (NON-UNIQUE)
18 1 TABLE ACCESS (CLUSTER) OF 'TS$'
19 18 INDEX (UNIQUE SCAN) OF 'I_TS#' (NON-UNIQUE)

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1389 consistent gets
0 physical reads
0 redo size
2528 bytes sent via SQL*Net to client
569 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
98 rows processed
SQL>
4.使用sql_trace查看,这个跟3差不多

在pl/sql或者sqlplus中,打开一个sql_window。
(1)先运行:alter session set sql_trace=true;
(2)再运行你那个返回结果不正确的SQL
(3)再运行:alter session set sql_trace=false;
(4)马上登陆到机器上,到$ORACLE_BASE/admin/sid/udump目录下。找到刚生成的.trc文件(假设文件名是1234455.trc)。执行命令:tkprof 1234455.trc aa.txt。查看aa.txt文件。这个文件里面有执行计划。看看执行计划每一步返回的结果集记录数是不是正确。

5.通过10053事件来查看,这里面可以查到一些关于SQL成本的详细信息

在pl/sql或者sqlplus中,打开一个sql_window。
(1)先运行:Alter session set events’10053 trace name context forever[,level {1/2}]’;

(2)再运行你那个返回结果不正确的SQL
(3)再运行:Alter session set events’10053 trace name context off’;

(4)马上登陆到10.1.4.10机器上,到$ORACLE_BASE/admin/sid/udump目录下。找到刚生成的.trc文件)。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7490392/viewspace-1023626/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7490392/viewspace-1023626/

你可能感兴趣的:(oracle10g 查看SQL执行计划)