①.、 查看最近执行的SQL语句
select?/*recentsql*/s.SQL_ID,s.CHILD_NUMBER,s.HASH_VALUE,s.ADDRESS,s.EXECUTIONS,s.SQL_TEXT
from?v$sql?s
where?s.PARSING_USER_ID?=?(
select?u.user_id?from?all_users?u
where?u.username?=?'YH_TEST'
and?upper(s.SQL_TEXT)?not?like?upper(?'%recentsql%')
select?/*+gather_plan_statistics*/?/*plan_statistics1*/?name?,salary?from?test?where?name?=?'t1'?;
select?s.SQL_ID,s.CHILD_NUMBER,s.HASH_VALUE,s.ADDRESS,s.EXECUTIONS,s.SQL_TEXT
where?upper(s.SQL_TEXT)?like?upper('%plan_statistics1%'?)
and?upper(s.SQL_TEXT)?not?like?upper(?'%v$sql%');
打开PL/SQL Developer软件,请确保plsql能够成功连接到一个oracle数据库.
可以看到窗口上方是sql语句,下方显示执行计划表格.表格的列主要包含描述、用户、对象、成本花费、IO开销等,表格,当然表格列还可以自定义.表格的行包含了查询逻辑的执行顺序和各个步骤信息.
执行计划表格内容的执行顺序是:按照从左至右,从上至下的步骤执行,具体是指执行计划按照层次逐步缩进,从左至右看,缩进最多的那一步最先执行,如果缩进量相同,则按照从上而下的方法判断执行顺序.
通过查看执行计划表格的cost列,即成本花费能够知道哪个步骤花费的成本高,通过查看执行计划表格的行中的objectname列,能够知道是否使用到表中的索引.
一般需要借助第三方工具来查看执行计划.
工具:PL/SQL
步骤:
①.、打开第三方工具PL/SQL,并登录到指定数据库.
在SQL*PLUS,PL/SQL的命令窗口下执行下面步骤 :
SQLEXPLAIN PLAN FOR
SELECT * FROM SCOTT.EMP; --要解析的SQL脚本
SQLSELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
如图
完成以上步骤后还需要在SQL*PLUS下输入代码执行命令:
SQLSET TIMING ON --控制显示执行时间统计数据 SQLSET AUTOTRACE ON EXPLAIN --这样设置包含执行计划、脚本数据输出,没有统计信息
接着我们输入第二段代码:
SQL执行需要查看执行计划的SQL语句 SQLSET AUTOTRACE OFF --不生成AUTOTRACE报告,这是缺省模式
然后是第三段
SQL SET AUTOTRACE ON --这样设置包含执行计划、统计信息、以及脚本数据输出 SQL执行需要查看执行计划的SQL语句 SQLSET AUTOTRACE OFF
第四段代码:
SQL SET AUTOTRACE TRACEONLY --这样设置会有执行计划、统计信息,不会有脚本数据输出
SQL执行需要查看执行计划的SQL语句 SQLSET AUTOTRACE TRACEONLY STAT --这样设置只包含有统计信息 SQL执行需要查看执行计划的SQL语句
需要注意的是:在Oracle Database中,PL/SQL Developer 工具并不完全支持所有的SQL*Plus命令,如果执行"SET AUTOTRACE ON"命令就会报错,出现此时此刻呢的情况:
SQL SET AUTOTRACE ON;
Cannot SET AUTOTRAC
PL/SQL DEVELOPER工具里面执行上面脚本过后,我们是看不到相关信息的,这时我们可以通过输入脚本代码查询执行过的信息,代码如下:
SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' || P.SPID || '.trc' TRACE_FILE_NAME FROM ( SELECT P.SPID FROM V$MYSTAT M, V$SESSION S, V$PROCESS P WHERE M.STATISTIC# =1 AND S.SID = M.SID AND P.ADDR = S.PADDR ) P, ( SELECT T.INSTANCE FROM V$THREAD T, V$PARAMETER V WHERE V.NAME ='thread' AND (V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE)) ) I, (SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T
如图所示:
执行上面命令后,就可以查看生成的文本文件了如图