查看执行计划的几种方法

时间:2024.3.15

查看Oracle执行计划的几种方法

一、通过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 autotracetraceonly

这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,如果执行该语句时遇到错误,解决方法为:

(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 executions>0 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$mystatm,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$threadt,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$threadt,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


第二篇:TOAD中查看SQL的执行计划


TOAD中查看SQL的执行计划

一、TOAD中查看SQL的执行计划:

1、点击工具栏上120救护车图标按钮

2、快捷键Ctrl+E

3、菜单View-Explain plan

二、如果是默认安装TOAD,在查看执行计划时会报一个错:

ORA-02404: 未找到指定的计划表

稍微研究了一下,解决这个问题基本上有3个方案:

1、最直接的解决方案:直接创建TOAD所需要的计划表,该脚本在%oracle_home%\rdbms\admin\utlxplan.sql中,不过该脚本是创建PLAN_TABLE表,表结构一样,改名为TOAD_PLAN_TABLE 即可。如下:

CREATE TABLE TOAD_PLAN_TABLE (

STATEMENT_ID VARCHAR2 (32),

TIMESTAMP DATE,

REMARKS VARCHAR2 (80),

OPERATION VARCHAR2 (30),

OPTIONS VARCHAR2 (30),

OBJECT_NODE VARCHAR2 (128),

OBJECT_OWNER VARCHAR2 (30),

OBJECT_NAME VARCHAR2 (30),

OBJECT_INSTANCE NUMBER,

OBJECT_TYPE VARCHAR2 (30),

SEARCH_COLUMNS NUMBER,

ID NUMBER,

COST NUMBER,

PARENT_ID NUMBER,

POSITION NUMBER,

CARDINALITY NUMBER,

OPTIMIZER VARCHAR2 (255),

BYTES NUMBER,

OTHER_TAG VARCHAR2 (255),

OTHER LONG,

PARTITION NUMBER,

PARTITION_START VARCHAR2 (255),

PARTITION_STOP VARCHAR2 (255),

DISTRIBUTION VARCHAR2 (30) ) ;

2、偷机取巧的处理方案:修改TOAD参数

将菜单 View -> Options ->Oracle -> General -> Explain Plan Table name中的参数修改为PLAN_TABLE即可使用。

3、通过TOAD自带功能创建表结构:

在菜单 tools -> server side objects wizard下运行,不过要建立一些对象,最好建议一个单独的表空间放这些对象。

在10g中带有plan_table这张表,但是将名字改为了plan_table$

只需$ORACLE_HOME/sqlplus/admin/plustrce.sql创建plustrace角色

grant plustrace to public

更多相关推荐:
执行计划的查看和分析

执行计划的查看和分析1如何获得执行计划要为一个语句生成执行计划可以有3种方法11autotraceSqlgtsetautotraceonSqlgtselectfromdual执行完语句后会显示explainpl...

ORACLE查看执行计划及SQL TRACE

ORACLE中查看执行计划及SQLTRACE有三种方法1ExplainplanSQLgtexplainplanforselectfromaa查看结果SQLgtselectfromtabledbmsxplandi...

Oracle中查看已执行sql的执行计划

Oracle中查看已执行sql的执行计划上一篇下一篇20xx0912105407个人分类原创笔记查看771评论8评分150有时候我们可能会希望查看一条已经执行过的sql的执行计划常用的方式有两种asetauto...

SQLServer查询执行计划分析

看懂执行计划例子1以AdventureWorks的DatabaseLog查询为例SELECTFROMAdventureWorks20xxR2dboDatabaseLogCachedplansizehowmuch...

看懂sql执行计划

对于SqlServer的优化来说可能优化查询是很常见的事情关于数据库的优化本身也是一个涉及面比较的广的话题首先打开SQLServerManagementStudio输入一个查询语句看看SqlServer是如何显...

SQL语句执行计划分析

TableScan表扫描如果看到这个信息就说明数据表上没有聚集索引或者查询优化器没有使用索引来查找意即资料表的每一行都被检查到如果资料表相对较小的话表扫描可以非常快速有时甚至快过使用索引因此当看到有执行表扫描时...

怎样看懂Oracle的执行计划

怎样看懂Oracle的执行计划一什么是执行计划Anexplainplanisarepresentationoftheaccesspaththatistakenwhenaqueryisexecutedwithin...

计划执行情况检查表

月周日工作计划执行情况检查表抽查备注打表示为已做打表示为未作空缺的表示其不用做此项计划

电力工程强制性条文执行计划检查表

xxxxxxxx工程建设标准强制性条文执行情况检查表xxxxxx有限公司11xxxx项目部20xx年10月强制性条文执行情况检查汇总表施工单位签名监理单位签名强制性条文执行情况检查表变电工程施工单位签名监理单位...

基建工程施工强制性条文执行计划及检查表

基建工程施工强制性条文执行计划及检查表110kV750kV架空输电线路工程设计

DB2_存储过程执行计划的查看及监控方法

一编写存储过程db2inst1db2labcattestsqlcreateproceduresalesstatusinquotaintegerdynamicresultsets2languagesqlbegin...

看懂SqlServer查询计划

对于SqlServer的优化来说可能优化查询是很常见的事情关于数据库的优化本身也是一个涉及面比较的广的话题本文只谈优化查询时如何看懂SqlServer查询计划由于本人对SqlServer的认识有限如有错误也恳请...

查看执行计划(36篇)