- 浏览: 165785 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
wjp2072:
...
oracle exec 和 call 区别 -
xuehua1987:
用js怎么能取到<xmdc:outputText val ...
js动态计算table某列值的总和 -
ljc1551008936:
...
oracle exec 和 call 区别 -
hardwin:
tar -C时,压缩包写在后面,运行不通过。
下面这个可以
...
UNIX 高手的10 个习惯(提高 Shell 操作的习惯) -
aaa20052cc:
写的真好,太感谢你了!辛苦了!
Swing 线程之SwingUtilities.invokeLater()
摘自:http://blog.csdn.net/kj021320/archive/2006/08/19/1096021.aspx
如何生成explain plan?
解答:运行utlxplan.sql. 建立plan 表
针对特定SQL语句,使用 explain plan set statement_id = 'tst1' into plan_table
运行utlxplp.sql 或 utlxpls.sql察看explain plan
EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.
你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行.
NESTED LOOP是少数不按照上述规则处理的操作, 正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理.
译者按:
通过实践, 感到还是用SQLPLUS中的SET TRACE 功能比较方便.
举例:
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)
Statistics
----------------------------------------------------------
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
通过以上分析,可以得出实际的执行步骤是:
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工具.也许喜欢图形化界面的朋友们可以选用它们.
----------------------------------------------------------------------------
对于sql执行的小量高低.我们可以通过执行计划的信息基本上可以进行分析查看该SQL语句执行的时间.连接顺序及浪费的数据库资源等信息,从而判断该SQL语句执行的效率如何,下面就简单的介绍一下执行计划的使用
2. Explain使用
Oracle RDBMS执行每一条SQL语句,都必须经过Oracle优化器的评估。所 以,了解优化器是如何选择(搜索)路径以及索引是如何被使用的,对优化SQL语句有很大的帮助。Explain可以用来迅速方便地查出对于给定SQL语句中的查询数据是如何得到的即搜索路径(我们通常称为Access Path)。从而使我们选择最优的查询方式达到最大的优化效果。
2.1. 安装
要使用执行计划首先需要执行相应的脚本。
使用Explain工具需要创建Explain_plan表,这必须先进入相关应用表、视图和索引的所有者的帐户内。Oracle的介质中包含有执行此项工作的SQL源程序,例如:
ORA_RDBMS: XPLAINPL.SQL (VMS)
$ORACLE_HOME/rdbms/admin/utlxplan.sql (UNIX)
该脚本后会生成一个表这个程序会创建一个名为plan_table的表,表结构如下:
我们简单的介绍一下主要的字段含义:
字段名 字段类型 含义
STATEMENT_ID VARCHAR2(30) explain PLAN 语句中所指定的最优STATEMENT_ID 参数值, 如果在EXPLAN PLAN语句中没有使用SET STATEMENT_ID,那么此值会被设为NULL。
REMARKS VARCHAR2(80) 与被解释规划的各步骤相关联的注释最长可达80 字节
OPERATION VARCHAR2(30) 各步骤所执行内部操作的名称在某条语句所产生的第一行中该列的可能取值如下DELETE STATEMENT INSERT STATEMENT SELECT STATEMENT UPDATE STATEMENT
OPTIONS VARCHAR2(30) 对OPERATION 列中所描述操作的变种
OBJECT_NODE VARCHAR2(128) 用于访问对象的数据库链接database link 的名称对于使用并行执行的本地查询该列能够描述操作中输出的次序
OBJECT_OWNER VARCHAR2(30) 对于包含有表或索引的架构schema 给出其所有者的名称
OBJECT_NAME VARCHAR2(30) 表或索引的名称
OBJECT_INSTANCE INTEGER 根据对象出现在原始original 语句中的次序所给出的相应次序编号就原始的语句文本而论其处理顺序为自左至右自外向内景象扩张view
OBJECT_TYPE VARCHAR2(30) 用于提供对象描述性信息的修饰符例如索引的NON-UNIQUE
OPTIMIZER VARCHAR2(255) 当前优化程序的模式
ID INTEGER 分配给执行规划各步骤的编号
PARENT_ID INTEGER 对ID 步骤的输出进行操作的下一个执行步骤的ID
POSITION INTEGER 对于具有相同PARENT_ID 的步骤其相应的处理次序
COST INTEGER 根据优化程序的基于开销的方法所估计出的操作开销值对于使用基于规则方法的语句该列为空该列值没有特定的测量单位它只是一个用于比较执行规划开销大小的权重值
CARDINALITY INTEGER 根据基于开销的方法对操作所访问行数的估计值
BYTES INTEGER 根据基于开销的方法对操作所访问字节的估计
2.2. 使用
2.2.1. 常规使用
常规使用语法:
explain PLAN [ SET STATEMENT_ID [=] < string literal > ]
[ INTO < table_name > ]
FOR < sql_statement >
其中:
STATEMENT_ID是一个唯一的字符串,把当前执行计划与存储在同一PLAN表中的其它执行计划区别开来。
TABLE_NAME是plan表名,它结构如前所示,你可以任意设定这个名称。
SQL_STATEMENT是真正的SQL语句。
如:
SQL> explain plan set statement_id='test1' for
2 SELECT a.soctermbegin,
3 a.soctermend,
4 a.dealserialno,
5 a.levydataid,
6 a.dealtotal,
7 e.categoryitemcode,
8 row_number() over(PARTITION BY a.levydataid ORDER BY 1) AS theRow
9 FROM tb_soc_packdealdata a,
10 tb_Lvy_TaxDataBillMap c,
11 Tb_lvy_BillData d,
12 tb_soc_levydetaildata e
13 WHERE a.levydataid = c.datafrompointer(+)
14 AND c.billdataid = d.billdataid(+)
15 AND a.levydataid = e.levydataid
16 AND a.packdealstatuscode = '10'
17 AND (a.datastatus <> '9' OR a.datastatus is NULL)
18 AND (d.billstatus IS NULL OR
19 (d.billstatus <> '2' AND d.billstatus <> '8'))
20 AND a.Insurcode = '6010952'
21 ;
Explained
执行下面语句就可以查看该语句执行的执行计划:
SQL> SELECT A.OPERATION,OPTIONS,OBJECT_NAME,OBJECT_TYPE,ID,PARENT_ID
2 FROM PLAN_TABLE a
3 WHERE STATEMENT_ID='test1'
4 ORDER BY Id;
OPERATION OPTIONS OBJECT_NAME OBJECT_TYPEID PARENT_ID
---------------- --------------------------------------------- ------------- ----------
SELECT STATEMENT 0
WINDOW SORT 1 0
FILTER 2 1
NESTED LOOPS OUTER 3 2
NESTED LOOPS OUTER 4 3
NESTED LOOPS 5 4
TABLE ACCESS FULL TB_SOC_PACKDEALDATA 6 5
TABLE ACCESS BY INDEX ROWID TB_SOC_LEVYDETAILDATA 7 5
INDEX RANGE SCAN IND_DATAID_LEVSOC NON-UNIQUE 8 7
TABLE ACCESS BY INDEX ROWID TB_LVY_TAXDATABILLMAP 9 4
INDEX RANGE SCAN TBLVYTAXDATABIL_DATAFROMPOINTE NON-UNIQUE 10 9
TABLE ACCESS BY INDEX ROWID TB_LVY_BILLDATA 11 3
INDEX UNIQUE SCAN TBLVYBILLDATA_BILLDATAID UNIQUE
2.2.2. 自动显示使用
在SQLPLUS中自动跟踪显示执行计划及相关信息
SQL>set timing on --显示执行时间
SQL>set autorace on �C显示执行计划
SQL>set autorace on �C显示执行计划
SQL>set autotrace traceonly �C只显示执行计划即不显示查询出来的数据
设置完毕后执行SQL语句就会显示执行计划信息及相应的统计信息(需要设置显示该选项)
SQL> select nvl(sum(t.taxdue), 0)
2 from tb_lvy_sbzs100 t, tb_lvy_declaredoc a, tb_lvy_declaredoc b
3 where a.dossiercode = 'SB02041108'
4 and a.pages = 123
5 and a.remarkid = b.remarkid
6 AND A.REMARKID IS NOT NULL
7 and b.declaredocid = t.declaredocid;
NVL(SUM(T.TAXDUE),0)
--------------------
0
已用时间: 00: 00: 04.07
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=1 Bytes=110)
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS (Cost=6 Card=1 Bytes=110)
3 2 MERGE JOIN (CARTESIAN) (Cost=4 Card=1 Bytes=74)
4 3 TABLE ACCESS (FULL) OF 'TB_LVY_SBZS100' (Cost=2 Card =1 Bytes=31)
5 3 BUFFER (SORT) (Cost=2 Card=1 Bytes=43)
6 5 TABLE ACCESS (FULL) OF 'TB_LVY_DECLAREDOC' (Cost=2 Card=1 Bytes=43)
7 2 TABLE ACCESS (BY INDEX ROWID) OF 'TB_LVY_DECLAREDOC' (Cost=2 Card=1 Bytes=36)
8 7 INDEX (UNIQUE SCAN) OF 'TBLVYDECLAREDOC_DECLAREDOCID' (UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls --循环递归次数
0 db block gets―请求的数据块在buffer能满足的个数
6675 consistent gets --逻辑IO用于读表并计算行数, 数据请求总数在回滚段Buffer中
45 physical reads �C从磁盘读到Buffer Cache数据块数量
0 redo size �C产生的redo日志大小
217 bytes sent via SQL*Net to client
276 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
如果6675 consistent gets --逻辑IO用于读表并计算行数, 数据请求总数在回滚段Buffer中
45 physical reads �C从磁盘读到Buffer Cache数据块数量
的数值比较小则该语句对对数据库的性能比较高。
2.2.3. PL/SQL和TOAD中使用
如果在PL/SQL中使用选择要查询语句显示执行计划,则只需要SQL WINDOWS 窗口里面输入要查询的SQL语句,然后选择按键F5或者在菜单TOOLS�D�D>Explain Plan 菜单按键就可以在执行计划窗口查看该语句的执行计划。
在TOAD语句中在执行当前的SQL窗口中选择下方的Explain PlanTAB页即可以查看要执行语句的执行计划信息。
2.3. 限制
虽然任何SQL语句都可以用explain解释,但对于没有查询的INSERT,UPDATE,DELETE操作来说,这个工具并没有太大的用处。没有子查询的INSERT操作不会创建执行计划,但没有WHERE子句或子查询的UPDATE和DELETE操作会创建执行计划,因为这些操作必须先找出所要的记录。
另外,如果你在SQL语句中使用其它类型如sequence等,explain也能揭示它的用法。
explain真正的唯一的限制是用户不能去解释其它用户的表,视图,索引或其它类型,用户必须是所有被解释事物的所有者,如果不是所有者而只有select权限,explain会返回一个错误。
发表评论
-
Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数
2008-09-11 11:21 2841oracle的分析函数over 及开窗函数 一:分析函数ov ... -
oracle 函数
2008-09-10 17:33 11141. trunc trunc实际上是truncate函数,字面 ... -
长数字隔三位用逗号","隔开,保留两位小数,指定长度,不足补空格
2008-08-26 16:26 4209长数字隔三位用逗号","隔开 sel ... -
ORACLE函数TO_CHAR以及数字转换格式
2008-08-26 14:46 21371摘自:http://lzfhope.blog.163.com/ ... -
利用Oracle的UTL_FILE包来实现对磁盘文件的I/O操作
2008-08-25 20:12 2095摘要:本文主要讨论如何利用Oracle的UTL_FILE包来实 ... -
oracle exception
2008-08-21 16:34 1861摘自:http://oracle.chinaitl ... -
pl/sql 代码编写规则
2008-08-21 15:42 2236摘自:http://yu-gao.blogspot ... -
oracle exec 和 call 区别
2008-07-30 16:53 12255exec 和 call 执行一个procedure时, e ... -
Oracle Union/Union All/Intersect/Minus区别
2008-07-30 16:24 2537摘自:http://www.cnblogs.com ... -
Dynamic Performance Tables not accessible 问题
2008-07-24 09:47 3838摘自:http://hi.baidu.com/wowodo/b ... -
将一个表的数据拷贝到另一个数据库
2008-07-04 09:32 1413COPY {FROM database | TO databa ... -
遍历删除所有序列名(sequence)
2008-07-02 20:44 1174declare cursor secur is sel ... -
oracle create tablespace、user and grant
2008-07-02 20:26 5032--创建表空间 create tablespace table ...
相关推荐
它能提供关于如何执行SQL语句的详细信息,包括哪些操作(如全表扫描、索引访问等)将被使用,以及这些操作的预计成本、时间及资源消耗。了解Explain Plan的使用和解读对于优化数据库性能至关重要。 一、Explain ...
其次,对于查询一条 SQL 语句的执行计划,需要使用 EXPLAIN PLAN 命令,并指定 STATEMENT_ID,以区分是哪一条 SQL 语句的执行计划。 第三,使用 EXPLAIN PLAN 命令执行计划后,可以使用 SQL 语句来显示执行计划结果...
Oracle 中的 explain_plan 是一个强大的分析工具,能够帮助用户了解 SQL 语句的执行计划,通过它可以了解 Oracle 是如何连接表、使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。下面详细讲解 ...
在不同的数据库系统中,如MySQL、Oracle、SQL Server等,都有相应的命令或工具用于查看SQL语句的执行计划,例如SQL Server的`SET SHOWPLAN_ALL`或`SET SHOWPLAN_TEXT`,Oracle的`EXPLAIN PLAN`。 4. **执行计划的...
### Oracle Explain Plan 总结 #### 一、Oracle 执行计划的重要性 在Oracle数据库中,为了提高查询效率和...无论是使用`EXPLAIN PLAN`还是`AUTOTRACE`,都能够帮助我们更好地理解SQL语句的执行流程,并据此进行优化。
使用`explain plan for`命令可以将SQL语句的执行计划存入前面创建的`PLAN_TABLE`中,然后使用`select * from table(dbms_xplan.display)`来查看具体的执行计划。 **2. 调整索引和统计信息** 根据执行计划的结果,...
### 通过分析SQL语句的执行计划优化SQL 在数据库管理与开发过程中,SQL语句的性能优化至关重要。本文将详细介绍如何理解SQL及其执行计划,并给出具体的优化策略。通过优化SQL,可以显著提升应用程序的响应速度及...
3. **执行计划**:通过EXPLAIN PLAN分析SQL执行路径,了解数据库如何处理查询,找出可能导致性能问题的步骤。 4. **索引策略**:正确创建和使用索引能显著提升查询速度,但过多的索引也会增加写操作的负担。 5. **...
需要了解如何使用EXPLAIN PLAN分析SQL语句,并据此调整索引以提高效率。此外,还需要知道如何避免在索引列上使用计算和NOT操作,以及如何使用>=替代>来利用索引。 5. SQL性能分析工具:使用TKPROF工具可以查询SQL...
在Oracle数据库系统中,"explain plan" 是一个关键的工具,用于分析和理解SQL查询的执行计划,也就是数据检索的路径。它可以帮助数据库管理员和开发人员优化查询性能,确保数据库高效运行。以下是对"explain plan ...
1.如何分析SQL语句 2.选用适合的ORACLE优化器 3.用EXPLAIN PLAN 分析SQL语句 4.使用TKPROF 工具来查询SQL性能状态 5.表分区的应用
`EXPLAIN PLAN`是一个SQL语句,它并不实际执行查询,而是解释和显示查询执行的逻辑步骤。这些步骤包括表扫描、索引访问、连接操作、排序和并行处理等。通过分析这些步骤,我们可以了解查询的执行效率,比如哪些部分...
8. **使用EXPLAIN PLAN或类似的工具**:大多数数据库系统提供工具查看执行计划,如MySQL的EXPLAIN,Oracle的EXPLAIN PLAN,或SQL Server的SET SHOWPLAN_ALL。这些工具帮助我们理解执行过程并定位问题。 9. **参数化...
Oracle SQL 语句执行效率问题查找与解决方法 一、 Oracle SQL 语句执行效率问题查找方法 Oracle 数据库系统中, SQL 语句的...通过对 Explain Plan 的分析,我们可以找到问题 SQL 语句的执行计划,从而优化执行效率。
例如,SQL语句`explain plan for select /*+ ordered */ e.deptno, d.deptno from emp e, dept d where e.deptno = d.deptno order by e.deptno, d.deptno;`显示了一个使用排序-合并连接的计划。在这个例子中,由于...
- 分析和调整执行计划:使用EXPLAIN PLAN分析SQL执行路径,通过ALTER SYSTEM或ALTER SESSION指令调整优化器行为。 - 优化子查询和联接操作:考虑子查询的替代方案,如使用连接或临时表。 - 使用绑定变量避免硬...
使用Toad的Explain Plan功能,可以对慢SQL语句进行深入分析,了解SQL语句的执行计划,包括索引使用情况、执行时间等信息。根据Explain Plan结果,数据库管理员可以对慢SQL语句进行优化,例如添加索引、重写SQL语句等...
7. **使用EXPLAIN PLAN分析查询**:Oracle提供了EXPLAIN PLAN工具,可以分析SQL语句的执行计划,帮助识别潜在的性能瓶颈,并据此进行调整。 8. **避免全表扫描**:尽量使SQL语句能够利用索引,避免全表扫描。全表...
- **规则描述**:使用EXPLAIN PLAN工具分析SQL语句的执行计划,了解Oracle如何连接表以及使用的扫描方式(如索引扫描或全表扫描)。 - **示例**:分析SQL语句的执行计划: ```sql EXPLAIN PLAN FOR SELECT * FROM ...