查看sql执行计划的方法
对于oracle dba来说,其中最多的时间是放在数据库优化上的,数据库优化也是衡量一个dba价值的重要方面,这个也在很多刚入门的dba去面试dba职位时被问及的最多并且也是必不可少的一个问题。而对于数据库优化,基本是对sql的优化,而要优化一条sql,则获取sql的执行计划便是第一步。
下边整理了7种oracle常用的获取sql执行计划的途径,包括获取当前sql的执行计划,获取sql的历史执行计划等。希望能帮助到大家。
(一)使用explain for 解释sql的执行计划,通过dbms_xplan()函数查看解释后的执行计划
注意:该方法并没有真正的执行指定的sql,而是将指定的sql进行了解释而已,并且在library cache中存在的该sql将是explain for select…
而不是指定的sql。
示例如下:
SQL> explain plan for 2 select * from scott.emp e where e.deptno in (select deptno from scott.dept); Explained. SQL> select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3074306753 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 14 | 560 | 3 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 14 | 560 | 3 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| EMP | 14 | 518 | 3 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| PK_DEPT | 1 | 3 | 0 (0)| 00:00:01 | ------------------------------------------------------------------------------ PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("E"."DEPTNO"="DEPTNO") 15 rows selected.
(二)使用dbms_xplan.display_cursor查看真实执行计划(10G以上)
使用这个函数可以显示内存中一个或者多个游标的执行计划。
语法:
Select * from table(dbms_xplan.display_cursor('hash_value','child_number','advanced'));
注意:如果第一个和第二个参数未设置,则会返回内存中最近的一个sql的执行计划,第三个参数用来设置格式输出
如下:
SQL> select /*+gather_plan_statistics*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 SQL> select * from table(dbms_xplan.display_cursor); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID ah916jr1wmqbg, child number 0 ------------------------------------- select /*+gather_plan_statistics*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3 Plan hash value: 653357053 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |* 1 | COUNT STOPKEY | | | | | | | 2 | NESTED LOOPS | | 2 | 80 | 2 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 2 | 74 | 2 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN| PK_DEPT | 1 | 3 | 0 (0)| | ------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROWNUM<3) 4 - access("E"."DEPTNO"="DEPTNO") PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 23 rows selected.
可以通过设置第一个和第二个参数显示指定的sql的真实执行计划
示例:
SQL> set line 200 SQL> select /*yallonking*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 SQL> col SQL_TEXT for a70 SQL> select sql_id,hash_value,child_number,sql_text from v$sql where sql_text like '%yallonking%'; SQL_ID HASH_VALUE CHILD_NUMBER SQL_TEXT ------------- ---------- ------------ ---------------------------------------------------------------------- abcarhr7w5g8b 3485646091 0 select /*yallonking*/ * from scott.emp e where e.deptno in (select dep tno from scott.dept) and rownum<3 d625bbv7utkq6 3484207814 0 select sql_id,hash_value,child_number,sql_text from v$sql where sql_te xt like '%yallonking%' dymhjyqqc7x7z 2898523391 0 select hash_value,child_number,sql_text from v$sql where sql_text like '%yallonking%'
注意:此处人为执行了一个sql(该sql加了注释,便于后边识别),然后从找到该sql的hash_value和子游标号(3485646091 0),此处也可以看到该游标是父游标,如果该sql在不同的环境下执行,将会产生不同的version count,这样的话子游标在该处会有多个。
然后进行设置函数dbms_xplan.display_cursor()的第一个和第二个参数查看指定的sql的执行计划。
使用格式化参数BASIC LAST ALLSTATS
SQL> select * from table(dbms_xplan.display_cursor(3485646091,0,'BASIC LAST ALLSTATS')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- EXPLAINED SQL STATEMENT: ------------------------ select /*yallonking*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3 Plan hash value: 653357053 ------------------------------------------------ | Id | Operation | Name | E-Rows | ------------------------------------------------ |* 1 | COUNT STOPKEY | | | PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 2 | NESTED LOOPS | | 2 | | 3 | TABLE ACCESS FULL| EMP | 2 | |* 4 | INDEX UNIQUE SCAN| PK_DEPT | 1 | ------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROWNUM<3) 4 - access("E"."DEPTNO"="DEPTNO") PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Note ----- - Warning: basic plan statistics not available. These are only collected when: * hint 'gather_plan_statistics' is used for the statement or * parameter 'statistics_level' is set to 'ALL', at session or system level 28 rows selected.
使用格式化参数advanced
SQL> select * from table(dbms_xplan.display_cursor(3485646091,0,'advanced')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- HASH_VALUE 3485646091, child number 0 -------------------------------------- select /*yallonking*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3 Plan hash value: 653357053 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |* 1 | COUNT STOPKEY | | | | | | | 2 | NESTED LOOPS | | 2 | 80 | 2 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 2 | 74 | 2 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN| PK_DEPT | 1 | 3 | 0 (0)| | ------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$5DA710D3 3 - SEL$5DA710D3 / E@SEL$1 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4 - SEL$5DA710D3 / DEPT@SEL$2 Outline Data ------------- /*+ BEGIN_OUTLINE_DATA IGNORE_OPTIM_EMBEDDED_HINTS OPTIMIZER_FEATURES_ENABLE('10.2.0.1') ALL_ROWS OUTLINE_LEAF(@"SEL$5DA710D3") PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- UNNEST(@"SEL$2") OUTLINE(@"SEL$1") OUTLINE(@"SEL$2") FULL(@"SEL$5DA710D3" "E"@"SEL$1") INDEX(@"SEL$5DA710D3" "DEPT"@"SEL$2" ("DEPT"."DEPTNO")) LEADING(@"SEL$5DA710D3" "E"@"SEL$1" "DEPT"@"SEL$2") USE_NL(@"SEL$5DA710D3" "DEPT"@"SEL$2") END_OUTLINE_DATA */ Predicate Information (identified by operation id): PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------- 1 - filter(ROWNUM<3) 4 - access("E"."DEPTNO"="DEPTNO") Column Projection Information (identified by operation id): ----------------------------------------------------------- 1 - "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22] PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 - "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22] 3 - "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22] 62 rows selected.
使用hint gather_plan_statistics结合函数dbms_xplan.display_cursor()输出含有统计信息的详细的sql的执行计划
SQL> alter system flush shared_pool; System altered. SQL> select /*+gather_plan_statistics*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 SQL> select sql_id,hash_value,child_number,sql_text from v$sql where sql_text like '%scott%'; SQL_ID HASH_VALUE CHILD_NUMBER SQL_TEXT ------------- ---------- ------------ -------------------------------------------------------------------------------- g071m9pbmk8a0 1463361856 0 select sql_id,hash_value,child_number,sql_text from v$sql where sql_text like '% scott%' ah916jr1wmqbg 3284785519 0 select /*+gather_plan_statistics*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3 SQL> select * from table(dbms_xplan.display_cursor(3284785519,0,'BASIC LAST ALLSTATS')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- EXPLAINED SQL STATEMENT: ------------------------ select /*+gather_plan_statistics*/ * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3 Plan hash value: 653357053 ----------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ----------------------------------------------------------------------------------------- |* 1 | COUNT STOPKEY | | 1 | | 2 |00:00:00.01 | 10 | PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 2 | NESTED LOOPS | | 1 | 2 | 2 |00:00:00.01 | 10 | | 3 | TABLE ACCESS FULL| EMP | 1 | 2 | 2 |00:00:00.01 | 8 | |* 4 | INDEX UNIQUE SCAN| PK_DEPT | 2 | 1 | 2 |00:00:00.01 | 2 | ----------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROWNUM<3) 4 - access("E"."DEPTNO"="DEPTNO") 22 rows selected.
(三)使用dbms_xplan.display_awr()函数查看存储在awr中的历史执行计划
首先找个历史的sql_id
SQL> set line 300 SQL> select * from dba_hist_sqltext where rownum<3 and COMMAND_TYPE=3; DBID SQL_ID SQL_TEXT COMMAND_TYPE ---------- ------------- -------------------------------------------------------------------------------- ------------ 4093928674 byaarkxm6b0r1 SELECT /*+ use_nl(u,o,t) */ NVL(T.DEGREE,1) FROM USER$ U,OBJ$ O,TAB$ T WHERE U.N 3 4093928674 4qfx5ur8a90ym select u.name,o.name from tab$ t,user$ u,obj$ o where t.bobj#=:1 and t.obj#=o.ob 3
然后使用dbms_xplan.display_awr()函数查看历史执行计划
SQL> select * from table(dbms_xplan.display_awr('4qfx5ur8a90ym')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ SQL_ID 4qfx5ur8a90ym -------------------- select u.name,o.name from tab$ t,user$ u,obj$ o where t.bobj#=:1 and t.obj#=o.obj# and o.owner#=u.user# Plan hash value: 1863015984 ----------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 6 (100)| | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | 1 | NESTED LOOPS | | 2 | 96 | 6 (0)| 00:00:01 | | 2 | NESTED LOOPS | | 2 | 62 | 4 (0)| 00:00:01 | | 3 | TABLE ACCESS BY INDEX ROWID| TAB$ | 2 | 12 | 2 (0)| 00:00:01 | | 4 | INDEX RANGE SCAN | I_TAB1 | 1 | | 1 (0)| 00:00:01 | | 5 | TABLE ACCESS BY INDEX ROWID| OBJ$ | 1 | 25 | 1 (0)| 00:00:01 | | 6 | INDEX UNIQUE SCAN | I_OBJ1 | 1 | | 0 (0)| | | 7 | TABLE ACCESS CLUSTER | USER$ | 1 | 17 | 1 (0)| 00:00:01 | | 8 | INDEX UNIQUE SCAN | I_USER# | 1 | | 0 (0)| | ----------------------------------------------------------------------------------------- 21 rows selected.
(四)使用$ORACLE_HOME/rdbms/admin/awrsqrpt.sql 生成指定sql_id的历史执行计划
SQL> @?/rdbms/admin/awrsqrpt.sql Current Instance ~~~~~~~~~~~~~~~~ DB Id DB Name Inst Num Instance ----------- ------------ -------- ------------ 4093928674 ORA10GR2 1 ora10gr2 Specify the Report Type ~~~~~~~~~~~~~~~~~~~~~~~ Would you like an HTML report, or a plain text report? Enter 'html' for an HTML report, or 'text' for plain text Defaults to 'html' Enter value for report_type: Type Specified: html Instances in this Workload Repository schema ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DB Id Inst Num DB Name Instance Host ------------ -------- ------------ ------------ ------------ * 4093928674 1 ORA10GR2 ora10gr2 rhl5.5 * 4093928674 1 ORA10GR2 ora10gr2 ora10gr2 * 4093928674 1 ORA10GR2 ora10gr2 ora11gr2 Using 4093928674 for database Id Using 1 for instance number Specify the number of days of snapshots to choose from ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Entering the number of days (n) will result in the most recent (n) days of snapshots being listed. Pressing <return> without specifying a number lists all completed snapshots. Enter value for num_days: Listing all Completed Snapshots Snap Instance DB Name Snap Id Snap Started Level ------------ ------------ --------- ------------------ ----- ora10gr2 ORA10GR2 18 21 Feb 2013 19:42 1 19 21 Feb 2013 21:00 1 20 21 Feb 2013 22:00 1 Specify the Begin and End Snapshot Ids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Enter value for begin_snap: 18 Begin Snapshot Id specified: 18 Enter value for end_snap: 20 End Snapshot Id specified: 20 Specify the SQL Id ~~~~~~~~~~~~~~~~~~ Enter value for sql_id: 393c9swv9f3gt … … 以下省略
注意:该处需要指定问题sql的sql_id,而sql_id可以通过awr报告或者addm等事先获取。
(五)通过客户端sql*plus自带的autotrace工具自动生成sql执行计划
首先,需要创建plustrace角色并给用户赋予相关的plustrace角色
SQL> grant connect,resource,select any table to test; Grant succeeded. SQL> conn test/test Connected. SQL> set autotrace traceonly SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled SP2-0611: Error enabling STATISTICS report SQL> show user USER is "SYS" SQL> @?/sqlplus/admin/plustrce.sql SQL> SQL> drop role plustrace; drop role plustrace * ERROR at line 1: ORA-01919: role 'PLUSTRACE' does not exist SQL> create role plustrace; Role created. SQL> SQL> grant select on v_$sesstat to plustrace; Grant succeeded. SQL> grant select on v_$statname to plustrace; Grant succeeded. SQL> grant select on v_$mystat to plustrace; Grant succeeded. SQL> grant plustrace to dba with admin option; Grant succeeded. SQL> SQL> set echo off SQL> grant plustrace to test; Grant succeeded. SQL> conn test/test Connected. SQL> set autotrace traceonly SQL> select * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3; Execution Plan ---------------------------------------------------------- Plan hash value: 653357053 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 80 | 2 (0)| 00:00:01 | |* 1 | COUNT STOPKEY | | | | | | | 2 | NESTED LOOPS | | 2 | 80 | 2 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 2 | 74 | 2 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN| PK_DEPT | 1 | 3 | 0 (0)| 00:00:01 | ------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(ROWNUM<3) 4 - access("E"."DEPTNO"="DEPTNO") Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 10 consistent gets 0 physical reads 0 redo size 898 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 2 rows processed
(六)通过用户的sql_trace的dump文件查看用户sql的执行计划
首先,便于查找当前用户的trace文件,先标示该用户的trace文件。
SQL> alter session set tracefile_identifier='yallonking'; Session altered. SQL> set line 200
打开用户的sql_trace并收集sql执行的信息后关闭sql_trace
SQL> alter session set sql_trace=true; Session altered. SQL> select * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 SQL> alter session set sql_trace=false; Session altered.
查找用户trace文件
SQL> !ls -ltr /u01/app/oracle/admin/ora10gr2/udump/*yallonking* -rw-r----- 1 oracle oinstall 70 Feb 21 23:15 /u01/app/oracle/admin/ora10gr2/udump/ora10gr2_ora_9540_yallonking.trc -rw-r----- 1 oracle oinstall 2003 Feb 21 23:16 /u01/app/oracle/admin/ora10gr2/udump/ora10gr2_ora_9647_yallonking.trc -rw-r----- 1 oracle oinstall 2146 Feb 21 23:17 /u01/app/oracle/admin/ora10gr2/udump/ora10gr2_ora_9655_yallonking.trc
查看用户trace文件中的执行计划
SQL> !vi /u01/app/oracle/admin/ora10gr2/udump/ora10gr2_ora_9655_yallonking.trc /u01/app/oracle/admin/ora10gr2/udump/ora10gr2_ora_9655_yallonking.trc Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1 System name: Linux Node name: ora10gr2 Release: 2.6.18-194.el5 Version: #1 SMP Tue Mar 16 21:52:43 EDT 2010 Machine: i686 Instance name: ora10gr2 Redo thread mounted by this instance: 1 Oracle process number: 15 Unix process pid: 9655, image: oracle@ora10gr2 (TNS V1-V3) *** 2013-02-21 23:17:11.037 *** SERVICE NAME:(SYS$USERS) 2013-02-21 23:17:11.037 *** SESSION ID:(159.38) 2013-02-21 23:17:11.037 ===================== PARSING IN CURSOR #1 len=32 dep=0 uid=0 oct=42 lid=0 tim=1329606866247139 hv=1569151342 ad='3e3f7fbc' alter session set sql_trace=true END OF STMT EXEC #1:c=1000,e=674,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1329606866247129 ===================== PARSING IN CURSOR #1 len=88 dep=0 uid=0 oct=3 lid=0 tim=1329606871299685 hv=747907697 ad='43f3aef4' select * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<3 END OF STMT PARSE #1:c=1000,e=1402,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1329606871299673 EXEC #1:c=0,e=268,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1329606871300323 FETCH #1:c=1999,e=1761,p=0,cr=8,cu=0,mis=0,r=1,dep=0,og=1,tim=1329606871302309 FETCH #1:c=0,e=58,p=0,cr=2,cu=0,mis=0,r=1,dep=0,og=1,tim=1329606871304230 STAT #1 id=1 cnt=2 pid=0 pos=1 obj=0 op='COUNT STOPKEY (cr=10 pr=0 pw=0 time=1756 us)' STAT #1 id=2 cnt=2 pid=1 pos=1 obj=0 op='NESTED LOOPS (cr=10 pr=0 pw=0 time=1711 us)' STAT #1 id=3 cnt=2 pid=2 pos=1 obj=51148 op='TABLE ACCESS FULL EMP (cr=8 pr=0 pw=0 time=1091 us)' STAT #1 id=4 cnt=2 pid=2 pos=2 obj=51147 op='INDEX UNIQUE SCAN PK_DEPT (cr=2 pr=0 pw=0 time=637 us)' *** 2013-02-21 23:17:28.830 ===================== PARSING IN CURSOR #1 len=33 dep=0 uid=0 oct=42 lid=0 tim=1329606883623491 hv=525901419 ad='43c4d108' alter session set sql_trace=false END OF STMT PARSE #1:c=10999,e=10341,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1329606883623481 EXEC #1:c=999,e=588,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1329606883624361
(七)使用_optimizer_trace或者10053跟踪事件生成sql的执行计划
SQL> set line 200 SQL> alter session set "_optimizer_trace"=all; Session altered. SQL> select * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<4; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 SQL> alter session set "_optimizer_trace"=none; Session altered.
查看当前会话的trace文件位置
SQL> SELECT a.VALUE 2 || b.symbol 3 || c.instance_name 4 || '_ora_' 5 || d.spid 6 || '.trc' trace_file 7 FROM (SELECT VALUE 8 FROM v$parameter 9 WHERE NAME = 'user_dump_dest') a, 10 (SELECT SUBSTR (VALUE, -6, 1) symbol 11 FROM v$parameter 12 WHERE NAME = 'user_dump_dest') b, 13 (SELECT instance_name 14 FROM v$instance) c, 15 (SELECT spid 16 FROM v$session s, v$process p, v$mystat m 17 WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d 18 / TRACE_FILE -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- /u01/app/oracle/admin/ora10gr2/udump/ora10gr2_ora_9759.trc
查看该trace文件中的部分
… … sql_id=16v398fw5h696. Current SQL statement for this session: select * from scott.emp e where e.deptno in (select deptno from scott.dept) and rownum<4 ============ Plan Table ============ ---------------------------------------+-----------------------------------+ | Id | Operation | Name | Rows | Bytes | Cost | Time | ---------------------------------------+-----------------------------------+ | 0 | SELECT STATEMENT | | | | 2 | | | 1 | COUNT STOPKEY | | | | | | | 2 | NESTED LOOPS | | 3 | 120 | 2 | 00:00:01 | | 3 | TABLE ACCESS FULL | EMP | 3 | 111 | 2 | 00:00:01 | | 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 3 | 0 | | ---------------------------------------+-----------------------------------+ Predicate Information: ---------------------- 1 - filter(ROWNUM<4) 4 - access("E"."DEPTNO"="DEPTNO") … …
以上便是常用的查看一个sql的执行计划的方法,且均在oracle10g版本实验通过。
写的很详尽,也很实用