ORACLE数据库查看执行计划的方法(3)
来源:asp之家 时间:2012-06-06 20:15:52
4.3跟踪其它用户的进程,在很多时候我们需要跟踪其它用户的进程,而不是当前用户,可以通过ORACLE提供的系统包
DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION来完成。
例如:
代码如下:
SELECT SID, SERIAL#, USERNAME FROM V$SESSION WHERE USERNAME = 'ETL'
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(61,76,TRUE);
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(61,76,FALSE);
5 利用10046事件
代码如下:
ALTER SESSION SET TRACEFILE_IDENTIFIER = 10046;
ALTER SESSION SET EVENTS='10046 trace name context forever, level 8';
SELECT * FROM SCOTT.EMP;
ALTER SESSION SET EVENTS ='10046 trace name context off';
然后你可以用脚本查看追踪文件的位置
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
查询结果为wgods_ora_28279.trc文件, 但是去相应目录却没有找到对应的追踪文件,而是如下trace文件:wgods_ora_28279_10046.trc
6 利用10053事件
有点类似10046,在此略过、
7 系统视图
通过下面一些系统视图,你可以看到一些零散的执行计划的相关信息,有兴趣的话可以多去研究一下。
代码如下:
SELECT * FROM V$SQL_PLAN
SELECT * FROM V$RSRC_PLAN_CPU_MTH
SELECT * FROM V$SQL_PLAN_STATISTICS
SELECT * FROM V$SQL_PLAN_STATISTICS_ALL
SELECT * FROM V$SQLAREA_PLAN_HASH
SELECT * FROM V$RSRC_PLAN_HISTORY
三、看懂执行计划
1.执行顺序
执行顺序的原则是:由上至下,从右向左
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。
当然,你在PL/SQL工具中也可以通过它提供的功能来查看执行顺序。如下图所示:
2.执行计划中字段解释
SQL>
名词解释:
recursive calls 递归调用
db block gets 从buffer cache中读取的block的数量当前请求的块数目,当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的正常情况下,一个查询提取的块是在查询查询开始的那个时间点上存在的数据库,当前块是在这个时候存在数据块,而不是这个时间点之前或者之后的的数据块数目。
consistent gets 从buffer cache中读取的undo数据的block的数量数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块,,这里的概念是在你处理你这个操作的时侯需要在一致性读状态上处理多个块,这些块产生的主要原因是因为你在查询过程中,由于其它会话对数据 块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所要需要对回滚 段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。
physical reads 物理读 就是从磁盘上读取数据块的数量。其产生的主要原因是:
1:在数据库高速缓存中不存在这些块。
2:全表扫描
3:磁盘排序
redo size DML生成的redo的大小
sorts (memory) 在内存执行的排序量
sorts (disk) 在磁盘执行的排序量
2091 bytes sent via SQL*Net to client 从SQL*Net向客户端发送了2091字节的数据
416 bytes received via SQL*Net from client 客户端向SQL*Net发送了416字节的数据。
参考文档:SQLPlus User's Guide and Reference Release 11.1
db block gets 、 consistent gets 、 physical reads这三者的关系可以概括为:逻辑读指的是ORACLE从内存读到的数据块块数量,一般来说是:
consistent gets + db block gets. 当在内存中找不到所需要的数据块的话,就需要从磁盘中获取,于是就产生了物理读。