打开Oracle Database软件后进入软件数据库主界面,在PL/SQL下按F5查看执行计划,在这里面可以看到基数、优化器、耗费等基本信息 如图
成都网站建设、成都做网站介绍好的网站是理念、设计和技术的结合。成都创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。
2
在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 --这样设置会有执行计划、统计信息,不会有脚本数据输出
最后输入第5段代码:
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
如图所示:
我们通过Oracle Database,查看执行计划后,通常要以文本的形式保存下来,可以输入命令:tkprof D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.trc h:\out.txtoutputfile explain=etl/etl 执行 如图
执行上面命令后,就可以查看生成的文本文件了如图
以上就是如何用Oracle Database,查看执行计划的步骤,需要注意的是PL/SQL Developer 工具并不完全支持所有的SQL*Plus命令,执行SET AUTOTRACE ON 就如此,在PL/SQL Developer工具下执行此命令会报错。
F5为Oracle Database创建了一个安全、灵活、智能的平台。F5针对Oracle Database的应用就绪解决方案在数据库层提供了更好的运行性能和敏捷性,并加快了广域网上的数据复制。借助F5解决方案,IT部门能够提供一个在全局范围内优化用户体验和数据完整性的应用和数据库架构,同时也对数据和业务提供了端到端的安全保护。
在数据库层,F5作为应用服务器和Oracle Database之间协调者,提供了一个抽象和健康状
态监控层。在节点出现故障时(包括独立节点或Oracle实际应用集群 [RAC] 配置),流量
可以快速地从无响应的数据库服务器中重定向出来。利用BIG-IP LTM上集中的健康状态监
控功能,应用服务器的负载降低,从而释放宝贵的资源。此外,即使应用服务器可能有不
同的软件、版本以及超时和连接行为,BIG-IP LTM都提供了与数据库的可靠连接,有助于
保证所有应用之间的统一性能。
一、通过PL/SQL Dev工具
1、直接File-New-Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。
2、先执行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的执行计划了,看到的结果和1中的一样,所以使用工具的时候推荐使用1方法。
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。还有使用工具方法查看计划看到的信息不全,有些时候我们需要sqlplus的支持。
二、通过sqlplus
1.最简单的办法
Sql set autotrace on
Sql select * from dual;
执行完语句后,会显示explain plan 与 统计信息。
这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。如果不想执行语句而只是想得到执行计划可以采用:
Sql set autotrace traceonly
这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,如果执行该语句时遇到错误,解决方法为:
(1)在要分析的用户下:
Sqlplus @ ?
dbmsadminutlxplan.sql
(2) 用sys用户登陆
Sqlplus @ ?sqlplusadminplustrce.sql
Sqlplus grant plustrace to user_name;
- - user_name是上面所说的分析用户
2.用explain plan命令
(1) sqlplus explain plan for select * from testdb.myuser
(2) sqlplus select * from table(dbms_xplan.display);
上面这2种方法只能为在本会话中正在运行的语句产生执行计划,即我们需要已经知道了哪条语句运行的效率很差,我们是有目的只对这条SQL语句去优化。其实,在很多情况下,我们只会听一个客户抱怨说现在系统运行很慢,而我们不知道是哪个SQL引起的。此时有许多现成的语句可以找出耗费资源比较多的语句,如:
SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,
buffer_gets/executions AVG FROM v$sqlarea
WHERE executions0 AND buffer_gets 100000 ORDER BY 5;
ADDRESS TEXT BUFFER_GETS EXECUTIONS AVG
-------- ---------------------------------------- ----------- ---------- ------------------------------------------------------------
66D83D64 select t.name, (sel 421531 60104 7.01336017
66D9E8AC select t.schema, t.n 1141739 2732 417.913250
66B82BCC select s.synonym_nam 441261 6 73543.5
从而对找出的语句进行进一步优化。当然我们还可以为一个正在运行的会话中运行的所有SQL语句生成执行计划,这需要对该会话进行跟踪,产生trace文件,然后对该文件用tkprof程序格式化一下,这种得到执行计划的方式很有用,因为它包含其它额外信息,如SQL语句执行的每个阶段(如Parse、Execute、Fetch)分别耗费的各个资源情况(如CPU、DISK、elapsed等)。
3、启用SQL_TRACE跟踪所有后台进程活动:
全局参数设置: .OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
当前session中设置:
SQL alter session set SQL_TRACE=true;
SQL select * from dual;
SQL alter session set SQL_TRACE=false;
对其他用户进行跟踪设置:
SQL select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
128 54521 B
开启跟踪:SQL exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
关闭跟踪:SQL exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);
然后使用oracle自带的tkprof命令行工具格式化跟踪文件。
4、使用10046事件进行查询:
10046事件级别:
Lv1 - 启用标准的SQL_TRACE功能,等价于SQL_TRACE
Lv4 - Level 1 + 绑定值(bind values)
Lv8 - Level 1 + 等待事件跟踪
Lv12 - Level 1 + Level 4 + Level 8
全局设定:
OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"
当前session设定:
开启:SQL alter session set events '10046 trace name context forever, level 8';
关闭:SQL alter session set events '10046 trace name context off';
对其他用户进行设置:
SQL select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
SQL exec dbms_system.set_ev(127,31923,10046,8,'A');
5、使用tkprof格式化跟踪文件: (根据下面SQL语句得到的文件都不存在该目录下,郁闷啊,懵懂啊...)
一般,一次跟踪可以分为以下几步:
1、界定需要跟踪的目标范围,并使用适当的命令启用所需跟踪。
2、经过一段时间后,停止跟踪。此时应该产生了一个跟踪结果文件。
3、找到跟踪文件,并对其进行格式化,然后阅读或分析。
--使用一下SQL找到当前session的跟踪文件:
SELECT d.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' ) d;
-- 其它用户的 session
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name
from
( select p.spid from v$session s, v$process p
where s.sid= '27' and s. SERIAL#= '30' 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' ) d;
--查找后使用tkprof命令,将TRACE文件格式为到D盘的explain_format.txt文件中
SQL $tkprof d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc d:/explain_format.txt
文件内容大致如下(看不太懂....懵懂啊.....天啊....神啊.....过几时就懂了/////////////)
TKPROF: Release 9.2.0.1.0 - Production on 星期二 4月 20 13:59:20 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Trace file: d:/oracle/admin/FZLGFM/udump/fzlgfm_ora_3468.trc
Sort options: default
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
********************************************************************************
alter session set events '10046 trace name context forever, level 8'
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 1 0.00 0.00 0 0 0 0
Misses in library cache during parse: 0
Misses in library cache during execute: 1
Optimizer goal: CHOOSE
Parsing user id: SYS
打开PL/SQL Developer软件,请确保plsql能够成功连接到一个oracle数据库。
在PL/SQL Developer中写好一段SQL代码,按F5,或者点击“执行执行计划”图标,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划。
3
可以看到窗口上方是sql语句,下方显示执行计划表格。表格的列主要包含描述、用户、对象、成本花费、IO开销等,表格,当然表格列还可以自定义。表格的行包含了查询逻辑的执行顺序和各个步骤信息。
1:在plsql中按F5可以看SQL的执行计划
2:查系统视图可以查看某个SQL的实际消耗