关于explain plan的使用!
上一篇 / 下一篇 2007-03-26 00:00:00 / 个人分类:oracle
如何生成explain plan?
解答:运行utlxplan.sql. 建立plan 表
针对特定SQL语句,使用 explain plan set statement_id = 'tst1' into plan_table
运行utlxplp.sql 或 utlxpls.sql察看explain plan
ITPUB个人空间A4T:N5vfQ
EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.
你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行.
NESTED LOOP是少数不按照上述规则处理的操作, 正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理.
ITPUB个人空间SZ4[.rq-EHy JD
译者按:
通过实践, 感到还是用SQLPLUS中的SET TRACE 功能比较方便.
举例:
ITPUB个人空间"tWR3{[!G Fjx
SQL> list
1 SELECT *
2 FROM dept, emp
3* WHERE emp.deptno = dept.deptno
SQL> set autotrace traceonly /*traceonly 可以不显示执行结果*/
SQL> /
14 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 NESTED LOOPS
2 1 TABLE ACCESS (FULL) OF 'EMP'
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
-wMefh$N,F#ow%`0Statistics
----------------------------------------------------------
0 recursive calls
2 db block gets
30 consistent gets
0 physical reads
0 redo size
2598 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
ITPUB个人空间L2D7o4cDSnb*R
通过以上分析,可以得出实际的执行步骤是:
1. TABLE ACCESS (FULL) OF 'EMP'
2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
4. NESTED LOOPS (JOINING 1 AND 3)
注: 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具.也许喜欢图形化界面的朋友们可以选用它们. ITPUB个人空间pz#DCx
----------------------------------------------------------------------------
x6TW@CA(wC0对于sql执行的小量高低.我们可以通过执行计划的信息基本上可以进行分析查看该SQL语句执行的时间.连接顺序及浪费的数据库资源等信息,从而判断该SQL语句执行的效率如何,下面就简单的介绍一下执行计划的使用ITPUB个人空间KM1wr!bE4p1A*Q c
2. Explain使用ITPUB个人空间:j-{P8J|cs
Oracle RDBMS执行每一条SQL语句,都必须经过Oracle优化器的评估。所 以,了解优化器是如何选择(搜索)路径以及索引是如何被使用的,对优化SQL语句有很大的帮助。Explain可以用来迅速方便地查出对于给定SQL语句中的查询数据是如何得到的即搜索路径(我们通常称为Access Path)。从而使我们选择最优的查询方式达到最大的优化效果。
"s_i5i,kJ
FF02.1. 安装
g
Wv\/d L2T
?0要使用执行计划首先需要执行相应的脚本。ITPUB个人空间+`X8`Y#u^R
使用Explain工具需要创建Explain_plan表,这必须先进入相关应用表、视图和索引的所有者的帐户内。Oracle的介质中包含有执行此项工作的SQL源程序,例如:ITPUB个人空间6b8_/Ea;L
ORA_RDBMS: XPLAINPL.SQL (VMS) ITPUB个人空间g!M
T8B\M
$ORACLE_HOME/rdbms/admin/utlxplan.sql (UNIX)ITPUB个人空间7O
I#Z9a2r
该脚本后会生成一个表这个程序会创建一个名为plan_table的表,表结构如下:
2IQ y,`%u;R~0我们简单的介绍一下主要的字段含义:
\
L4[(^csg3Y0字段名 字段类型 含义
7r_ol0c_0STATEMENT_ID VARCHAR2(30) explain PLAN 语句中所指定的最优STATEMENT_ID 参数值, 如果在EXPLAN PLAN语句中没有使用SET STATEMENT_ID,那么此值会被设为NULL。 ITPUB个人空间&n7T}A&]
REMARKS VARCHAR2(80) 与被解释规划的各步骤相关联的注释最长可达80 字节
Ci/S7mg_9p"Kh0OPERATION VARCHAR2(30) 各步骤所执行内部操作的名称在某条语句所产生的第一行中该列的可能取值如下DELETE STATEMENT INSERT STATEMENT SELECT STATEMENT UPDATE STATEMENT
0KlNYP6Q0OPTIONS VARCHAR2(30) 对OPERATION 列中所描述操作的变种ITPUB个人空间b"c
N+T-ve
OBJECT_NODE VARCHAR2(128) 用于访问对象的数据库链接database link 的名称对于使用并行执行的本地查询该列能够描述操作中输出的次序
H^N#I?8K$N8x0OBJECT_OWNER VARCHAR2(30) 对于包含有表或索引的架构schema 给出其所有者的名称ITPUB个人空间i"i[)kV2V*k A-y
OBJECT_NAME VARCHAR2(30) 表或索引的名称ITPUB个人空间&t*j0qB]9b'P2_^
OBJECT_INSTANCE INTEGER 根据对象出现在原始original 语句中的次序所给出的相应次序编号就原始的语句文本而论其处理顺序为自左至右自外向内景象扩张viewITPUB个人空间4].z:K(wu+op6zL
OBJECT_TYPE VARCHAR2(30) 用于提供对象描述性信息的修饰符例如索引的NON-UNIQUE
4d8n|/P\7y7_f9d0OPTIMIZER VARCHAR2(255) 当前优化程序的模式ITPUB个人空间v(O]z`\
ID INTEGER 分配给执行规划各步骤的编号ITPUB个人空间-xz7X pvZ!C_9h
PARENT_ID INTEGER 对ID 步骤的输出进行操作的下一个执行步骤的IDITPUB个人空间V Z!@[4L5[({eq{k
POSITION INTEGER 对于具有相同PARENT_ID 的步骤其相应的处理次序ITPUB个人空间rLc
CKsG
COST INTEGER 根据优化程序的基于开销的方法所估计出的操作开销值对于使用基于规则方法的语句该列为空该列值没有特定的测量单位它只是一个用于比较执行规划开销大小的权重值ITPUB个人空间5N/z7o(JC.}+Mk*u(OP
CARDINALITY INTEGER 根据基于开销的方法对操作所访问行数的估计值ITPUB个人空间N`s4A Q"t
BYTES INTEGER 根据基于开销的方法对操作所访问字节的估计
2.2. 使用ITPUB个人空间2n/g/{)E%d
r"?
2.2.1. 常规使用ITPUB个人空间
G'A/h+iD `P8H4A-J5l
常规使用语法:ITPUB个人空间jDkA\xCz
explain PLAN [ SET STATEMENT_ID [=] <string literal> ] ITPUB个人空间}-t#N1p'E(D%DJ\u
[ INTO <table> ] ITPUB个人空间u6`d `
m_%p
FOR <sql>
L4E6j9nI Ytpj'?0其中:
$vx7h K7B%G g*[bC0STATEMENT_ID是一个唯一的字符串,把当前执行计划与存储在同一PLAN表中的其它执行计划区别开来。
6}&io_)e7[0TABLE_NAME是plan表名,它结构如前所示,你可以任意设定这个名称。
Bf$z@
W1R)sT0SQL_STATEMENT是真正的SQL语句。ITPUB个人空间ID:wLu.Rp(B
T f7v
如:
)c*ZX yu@i(kwm0SQL> explain plan set statement_id='test1' for
'F n^k"pv:O0 2 SELECT a.soctermbegin,ITPUB个人空间,W!P0T2d?
R
3 a.soctermend,ITPUB个人空间P0Ec#I4a
4 a.dealserialno,ITPUB个人空间Ly5pu&TA&o3RJ/Z
5 a.levydataid,
)Z-Fu"F_2`0 6 a.dealtotal,ITPUB个人空间qh`uW6rV1d
7 e.categoryitemcode,ITPUB个人空间*B5r,x)q%g\xQ@_
8 row_number() over(PARTITION BY a.levydataid ORDER BY 1) AS theRowITPUB个人空间![!AR0kEQe*g
9 FROM tb_soc_packdealdata a,