查看Oracle执行计划的几种常用方法-系列1

SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向。

执行计划的定义:执行目标SQL的所有步骤的组合

我们首先列出查看执行计划的一些常用方法:

1.
explain plan命令

PL/SQL Developer中通过快捷键F5就可以查看目标SQL的执行计划了。但其实按下F5后,实际后台调用的就是explain plan命令,相当于封装了该命令。

explain plan使用方法:

(1) 执行explain plan for + SQL

(2) 执行select * from table(dbms_xplan.display);

实验表准备:

SQL> desc test1;
 Name  Null           Type
 ----------------------------------------- -------- ----------------------------
 T1ID    NOT NULL NUMBER(38)
 T1V                       VARCHAR2(10)

SQL> desc test2;
 Name  Null           Type
 ----------------------------------------- -------- ----------------------------
 T2ID    NOT NULL NUMBER(38)
 T2V                       VARCHAR2(10)

实验

SQL> set linesize 100

SQL> explain plan for select t1id, t1v, t2id, t2v from test1, test2 where test1.t1id = test2.t2id;

Explained.

第一步使用explain plan对目标SQL进行了explain,第二步使用select * from table(dbms_xplan.display)语句展示出该SQL的执行计划。

这里test2作为驱动表,进行了全表扫描,test1作为被驱动表,由于其包含主键,所以用的是索引全扫描。左侧ID带*号的第四步操作,表示有谓词条件,这里可以看到既使用了主键索引(access),又使用了过滤条件(filter)。

2.
DBMS_XPLAN包

(1) select * from table(dbms_xplan.display);--上面以说明。

(2) select * from table(dbms_xplan.display_cursor(null, null, 'advanced'));

(3) select * from table(dbms_xplan.display_cursor('sql_id/hash_value',
child_cursor_number, 'advanced'));

(4) select * from table(dbms_xplan.display_awr('sql_id'));

(2) select
* from table(dbms_xplan.display_cursor(null, null, 'advanced'));

主要用于SQLPLUS中查看刚执行过SQL的执行计划。首先第三个参数可以选择'advanced':

接下来,第三个参数使用'all':

可以看出'advanced'记录的信息要比'all’多,主要就是多一个Outline Data。Outline Data主要是执行SQL时用于固定执行计划的内部HINT组合,可以将这部分内容摘出来加到目标SQL中以固定其执行计划

(3) select
* from table(dbms_xplan.display_cursor('sql_id/hash_value', child_cursor_number, 'advanced'));

其中第一个参数可以输入SQL的sql_id或hash value,方法就是如果执行的SQL仍在库缓存中,则可以使用V$SQL查询:

其中,使用@dbsnake大牛的SQL可以知道SQL_ID和HASH_VALUE的一一对应关系:

隐藏问题1:

这里的截图可能有点问题,结果并不准确,问题就出在这个SQL中使用的算法中,在另一篇博文中会仔细说明这个问题

使用:

SQL> select * from table(dbms_xplan.display_cursor('1p2fk2v00c865', 0, 'advanced'));

select * from table(dbms_xplan.display_cursor('3221627077', 0, 'advanced'));

就可以查出对应这条SQL的执行计划,内容同(2)中的'advanced',这就不展示了。

注意这还有第二个参数child_cursor_number,指的是子游标编号,如果未生成新的子游标,则此处写的是0。

(2)和(3)的结论相近,区别就是(2)只是针对最近一次执行SQL查看执行计划,(3)可以针对仍在库缓存中的任意一次SQL查看执行计划

(4) select
* from table(dbms_xplan.display_awr('sql_id'));

(1)是使用explain
plan for +SQL作为前提,(2)和(3)的前提则是SQL的执行计划还在共享池中,具体讲是在库缓存中。如果已经被age out交换出共享池,则不能用这两种方法了。若该SQL的执行计划被采集到AWR库中,则可以用(4)来查询历史执行计划。

隐藏问题2:

实验这部分内容发现使用select * from table(dbms_xplan.display_awr('sql_id'));并没有结果,@黄玮老师说有可能是AWR收集的是top的SQL,有可能测试用的SQL不是most
intensive SQL,但我是用alter system flush shared_pool后执行的手工采集快照,还是未被AWR抓到,比较奇怪的问题,这个也会在另一篇博文中仔细说明。

未完待续 。。。

To be continued ...

时间: 2024-09-16 02:31:20

查看Oracle执行计划的几种常用方法-系列1的相关文章

查看Oracle执行计划的几种常用方法-系列3

续上篇:http://blog.csdn.net/bisal/article/details/39225373 4. 10046事件 通过10046事件也可以查看目标SQL的执行计划.像10046这种事件,都不是Oracle官方文档中可以查询到的,这些事件一般用于调试目的,因此往往可以使用他们找到问题更详细的信息. 10046事件和之前的explain plan.DBMS_XPLAN包以及AUTOTRACE开关的区别在于,10046事件产生的trc文件中明确显示了目标SQL实际执行计划中每一步所

查看Oracle执行计划的几种常用方法-系列2

续上篇:http://blog.csdn.net/bisal/article/details/38919181 3. AUTOTRACE开关 SQLPLUS中打开AUTOTRACE开关可以得到SQL的执行计划. 从提示可以看到AUTOTRACE有几个选项: OFF/ON/TRACEONLY/EXPLAIN/STATISTICS. 实验: 1. 执行SET AUTOTRACE ON: 2. 执行SET AUTOTRACE TRACEONLY: 3. 执行SET AUTOTRACE TRACEONL

查看oracle执行计划方法( 一)

关于oracle执行计划的概念,参考之前的博客:http://blog.csdn.net/cymm_liu/article/details/7996599 如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题. 看懂执行计划也就成了SQL优化的先决条件. 这里的SQL优化指的是SQL性能问题的定位,定位后就可以解决问题. 一. 

查看oracle执行计划方法( 二)

1.Cardinality(基数)/ rows Cardinality值表示CBO预期从一个行源(row source)返回的记录数,这个行源可能是一个表,一个索引,也可能是一个子查询.   在Oracle 9i中的执行计划中,Cardinality缩写成Card. 在10g中,Card值被rows替换.   这是9i的一个执行计划,我们可以看到关键字Card:        执行计划 -------------------------------------------------------

如何查看Oracle执行计划

1)最简单的方法是,用PL/SQL 工具登录进去后,选中sql语句,然后按F5: 2)用PL/SQL工具登录进去后,打开command窗口 a) 执行:explain plan for select * from dual;--红色部分可替换为你的sql语句 b) 执行:select * from table(dbms_xplan.display()),即可获得执行计划; 3)用sqlplus命令登录,执行set autotrace traceonly;即可获得执行计划: 本栏目更多精彩内容:h

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

Oracle查看执行计划的几种方法   一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性.启用AUTOTRACE后,SQL*Plus会自动收集执行过的SQL语句的执行计划.性能统计数据等,并在语句执行结束后显示在SQL*Plus中. DBA用户可以直接使用AUTOTRACE功能,但是如果用户没有DBA权限,那么需要在SYS用户下执行plustrce.sql脚本,自动创建PLUSTRACE角色,再把PL

Oracle中获取执行计划的几种方法

1. 预估执行计划 - Explain Plan Explain plan以SQL语句作为输入,得到这条 SQL语句的执行计划,并将执行计划输出存储到计划表中. 首先,在你要执行的SQL语 句前加explain plan for,此时将生成的执行计划存储到计划表中,语句如下: explain plan for SQL语句 然后,在计划表中查询刚刚生成的执行计划,语 句如下: select * from table(dbms_xplan.display); 注意:Explain plan 只生成执

Oracle中获取执行计划的几种方法分析

以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下   1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中. 首先,在你要执行的SQL语句前加explain plan for,此时将生成的执行计划存储到计划表中,语句如下: explain plan for SQL语句然后,在计划表中查询刚刚生成的执行计划,语句如下: select * from table(

Oracle中获取执行计划的几种方法分析_oracle

1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中. 首先,在你要执行的SQL语句前加explain plan for,此时将生成的执行计划存储到计划表中,语句如下:explain plan for SQL语句然后,在计划表中查询刚刚生成的执行计划,语句如下:select * from table(dbms_xplan.display);注意:Explain plan只生成执行计划,并不会真正