在oracle中,要查看sql语句执行计划有很多种办法,这里介绍其中的2种:
sql_trace和10046 events。
通过tracle跟踪文件,可以看到比sql*plus中跟详尽的信息,从而针对sql语句优化更有针对性,这里只是介绍如何生成sql的trace file。以及简单的tkprof的使用。
1. 设置参数sql_trace=true
在这里先介绍下,跟踪文件的生成目录,通过参数可以查看具体目录:
[oracle@gtlions ~]$ sqlplus store/store
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 12月 22 16:40:38 2010
Copyright (c) 1982, 2009, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
store@TEST> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
store@TEST> show parameter user_dump_Dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /opt/oracle/db/diag/rdbms/test
/TEST/trace
查看下这个目录下的文件
[oracle@gtlions trace]$ pwd
/opt/oracle/db/diag/rdbms/test/TEST/trace
[oracle@gtlions trace]$ ls -l | grep "^-" | wc -l
777
可以看到有777个文件,原因是在正常运行过程中经常会不断地被填充,这么多文件中要查找我们要生成的跟踪文件似乎比较麻烦,虽然有规律可循,但是这里首先要介绍一个简单的办法,通过设置会话的跟踪文件的标识:
设置你的标识
store@TEST> alter session set tracefile_identifier='this_is_my_tracefile';
会话已更改。
设置会话参数sql_trace启用生成跟踪文件
store@TEST> alter session set sql_trace=true;
会话已更改。
执行sql语句
store@TEST> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 09-12月-82 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 12-1月 -83 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择14行。
关闭跟踪
store@TEST> alter session set sql_trace=false;
会话已更改。
store@TEST>
接下来看下生成的文件
[oracle@gtlions trace]$ ls -l |grep 'this'
-rw-r----- 1 oracle oinstall 56256 12-22 16:51 TEST_ora_3786_this_is_my_tracefile.trc
-rw-r----- 1 oracle oinstall 380 12-22 16:51 TEST_ora_3786_this_is_my_tracefile.trm
直接查看trc文件是很难受的,通过tkprof工具我们给你做个简单的加工
[oracle@gtlions trace]$ tkprof TEST_ora_3786_this_is_my_tracefile.trc ~/this_is_my_tracefile.trc
TKPROF: Release 11.2.0.1.0 - Development on 星期三 12月 22 16:58:32 2010
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
接着查看tkprof生成的新文件
[oracle@gtlions trace]$ cat ~/this_is_my_tracefile.trc
。。
SQL ID: a2dk8bdn0ujx7
Plan Hash: 3956160932
select *
from
emp
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.02 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.02 6 8 0 14
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.04 6 8 0 14
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 93
Rows Row Source Operation
------- ---------------------------------------------------
14 TABLE ACCESS FULL EMP (cr=8 pr=6 pw=0 time=0 us cost=3 size=532 card=14)
********************************************************************************
。。。
摘选部分段落
刚才说的定位跟踪文件的办法,还有个办法查询系统参数和当前session信息:
store@TEST> select c.value || '/' || d.instance_name || '_ora_' || a.spid || '.trc' trace
2 from v$process a, v$session b, v$parameter c, v$instance d
3 where a.addr = b.paddr
4 and b.audsid = userenv('sessionid')
5 and c.name = 'user_dump_dest';
TRACE
----------------------------------------------------------------------------------------------------
/opt/oracle/db/diag/rdbms/test/TEST/trace/TEST_ora_3786.trc
可以看到,如果我们不加自己的标识,这个就是本次生成的跟踪文件。
2. 设置events
第2个办法,设置session的events
store@TEST> alter session set events '10046 trace name context forever,level 12';
会话已更改。
store@TEST> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 09-12月-82 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 12-1月 -83 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择14行。
store@TEST> alter session set events '10046 trace name context off';
会话已更改。
3. 其他
使用dbms工具包。
本文只是简单介绍了通过设置会话的sql_trace或者10046 events来生成跟踪文件,以及是tkprof工具生成更易于查看的跟踪文件。
-The End-