oracle函数lp,Oracle 执行计划的查看方式

访问数据的方法:一、访问表的方法:1.全表扫描,2.ROWID扫描

二、访问索引的方法:1.索引唯一性扫描,2.索引范围扫描,3.索引全扫描,4.索引快速全扫描,5.索引跳跃式扫描

表连接:1.排序合并连接,2.嵌套循环连接,3.哈希连接,4.反连接,5.半连接,6.星型连接(多用于数据仓库,是一种单个事实表和多个维度表之间的连接,事实表和维度表之间是基于事实表的外键列和对应维度表的主键之间的连接)

执行计划:

方式一、explain plan

SQL> explain plan for select empno,ename,dname from scott.emp,scott.dept where emp.deptno = dept.deptno;

Explained

SQL> select * from table(dbms_xplan.display);

方式二、DBMS_XPLAN 包

针对不同的场景,可以选择四种不同的方法中的一种:

1.select * from table(dbms_xplan.display)

这需要和explain plan 配合使用,上面已经展示

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

用于在sqlplus中查看刚刚执行过的sql的执行计划,第三个参数还可为all,只是第三个参数是advanced结果会更详细

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

用于查看指定sql的执行计划,sql_id/hash_value和child_cursor_number可从v$sql视图中找到:

select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like 'SQL';

只要目标SQL的执行计划所在的Child Cursor还么有被age out出Share Pool,就可以使用此方法。

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

用于查看指定sql的所有历史执行计划。 方法2和3能够显示目标SQL执行计划的前提条件是该SQL还在Share Pool中,如果已经被age out出Share Pool,那么只要该SQL的执行计划被Oracle采集到AWR Repository中,我们就可以使用方法4来查看该SQL的所有执行计划。

select sql_text,sql_id,version_count,executions from v$sqlarea where sql_text like 'SQL';

version_count可以看出该SQL有几个Child Cursor。

和方法2和3相比,有个不好的地方是看不到执行步骤对应的谓词条件

方法三、AUTOTRACE开关

在sqlplus中将AUTOTRACE开关打开也能得到目标sql的执行计划,还能额外观察到目标SQL执行所消耗的物理读、逻辑读、产生redo的数量以及排序的数量。

SET AUTOTRACE {OFF|ON|TRACEONLY}

[EXPLAIN]

[STATISTICS]

SESSION默认是SET AUTOTRACE OFF

1.在当前SESSION中执行SET AUTOTRACE ON 可以在当前session中打开AUTOTRACE开关,这样,这个SESSION中随后执行的所有SQL除了显示SQL执行结果之外,还会额外显示SQL所对应的执行计划和资源消耗情况。

2.在当前SESSION中执行SET AUTOTRACE TRACEONLY,可以在当前SESSION中只显示SQL执行计划和额外消耗,而不显示结果。

3.在当前SESSION中执行SET AUTOTRACE TRACEONLY EXPLAIN可以在当前SESSION中只显示执行计划(SELECT不会被实际执行,DML语句会被实际执行)

4.在当前SESSION中执行SET AUTOTRACE TRACEONLYSTATISTICS可以在当前SESSION中只显示资源消耗

方法四、10046事件与tkprof命令

10046事件与上面三种的不同之处在于,所得到的执行计划中明确显示了目标SQL实行执行计划中每一个执行步骤所消耗的逻辑读、物理读和花费时间。

< 略 >

除了第四种方法外,前三种的方法得到的执行计划有可能是不准确的,要判断执行计划是否准确,就是看目标SQL是否真正被执行过,真正被实际执行过的SQL得到的执行计划准确。(此原则不适用于AUTOTRACE开关,因为所有使用AUTOTRACE开关所显示的执行计划都有可能是不准确的,即使对应的目标SQL已经被执行过,因为使用SET AUTOTRACE命令所显示的执行计划来源都是调用explain plan命令)

第一种方法得到的执行计划,目标SQL是没有被被实际执行过的,执行计划可能是不准确的尤其是目标SQL包含绑定变量时。

第二种方法的 2,3,4 得到的执行计划是准确的,因为此时目标SQL已经被实际执行过。

cuihua查看真实执行计划的脚本用法

9i: @'e:\xxx' sql_id child_cursor_number  --适合于9i之前数据库

printsql: 在数据库服务器上执行 topas命令后显示 SPID为1234的Oracle进程占用了14%CPU,查看这进程在做什么:

exec printsql(1234,'SPID')

printsql可帮把这个进程正在执行的SQL,该SQL真实的执行计划以及杀这个Session的语句打印出来

查看执行计划顺序口诀:先从最开头一直连续往右看,直到看到最右边的并列的地方;对于不并列的,靠右的先执行;如果见到并列的,就从上往下看,对于并列的部分,考上的先执行。

cuihua 查看执行顺序的脚本

xplan包

select * from table(xplan.display_cursor('sql_id',child_number,'advanced'));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值