请选择 进入手机版 | 继续访问电脑版

湖南新梦想

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 279|回复: 0

oracle获取执行计划(一)

[复制链接]

2493

主题

2892

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10294
发表于 2021-11-11 16:21:01 | 显示全部楼层 |阅读模式
一、六种获取执行计划的应用场景及具体使用方法
  • 如果某 SOL 执行很长时间才出结果或返回不了结果,这时就只能用方法1
  • 跟踪某条 SOL 最简单的方法是方法 1,其次就是方法2
  • 如果想观察某条 SOL 多个执行计划的情况,只能用方法4 和方法6
  • 如果 SOL 中含函数,函数中又套 SOL 等,即存在多层调用,想准确分析只能用方法5
  • 要想确保看到真实的执行计划,不能用方法1 和方法2
  • 要想获取表被访问的次数,只能使用3


使用这些命令前先打开sqlplus窗口,在窗口标题右键,在属性\布局,增加窗口宽度和屏幕缓冲区宽度(二者保持一致),以免展示结果时不方便看,窗口大小调整完毕,登录splplus后先输入如下命令,设置查询结果的列宽和行数
set linesize 1000
set pagesize 2000



( 1 ) explain plan for 获取,PLSQL的F5查看到的执行计划同(1)
explain plan for
select pv.* from PV_ENCOUNTER pv,pv_op op where pv.pk_pv=op.pk_pv and pv.name_pi='王雨红';
select * from table (dbms_xplan. display()) ;
/*
优点 :无须真正执行,快捷方便,不是真实的执行计划
缺陷 :
1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况) ;
         
2.无法判断处理了多少行;
         
3.无法判断表被访问了多少次。
*/


( 2 ) set autotrace XXX,此命令PLSQL不支持
set autotrace traceonly
select pv.* from PV_ENCOUNTER pv,pv_op op where pv.pk_pv=op.pk_pv and pv.name_pi='王雨红';
/*
set autotrace off-----------------此为默认值,即关闭Autotrace
set autotrace explain------------只显示执行计划

set autotracestatistics----------只显示执行的统计信息
set autotrace on-----------------显示查询结果、执行计划和统计信息
set autotrace traceonly--------与ON相似,但不显示语句的执行结果

优点:1. 可以输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况),
         2. 虽然必须要等语句执行完毕后才可以输出执行计划 但是可以有 traceonly 开关来控制返回结果不打屏输出。
缺陷:1. 必须要等到语句真正执行完毕后,才可以出结果,
         2. 无法看到表被访问了多少次
         3.尽管有真实去执行[url=]SQL[/url],但打印出来的执行计划并不一定准确,谓词和统计信息是真实的
*/


( 3 )set statistics_level=all
set autotrace off
alter session set statistics_level=all ;
select /*make_test*/ pv.* from PV_ENCOUNTER pv,pv_op op where pv.pk_pv=op.pk_pv and pv.name_pi='王雨红';
select sql_id,sql_text from v$sql where sql_text like '%make_test%';
select * from table(dbms_xplan.display_cursor('6ssx3ybzz6fah',null,'allstats')) ;

/*
Starts 为该 SQL 执行的次数。
E-Rows 为执行计划预计的行数。
A-Rows 为实际返回的行数。
E-Rows和A-Rows 做比较,就可以确定哪一步执行计划出了问题。
Time 为每一步实际执行的时间,根据这一行可以知道该 SQL 耗时在哪个地方。
Buffers 为每一步实际执行的逻辑读
Reads 为物理读

优点: 1. 可以清晰地从
Starts得出表被访问多少次;
          2. 可以清晰地从 E-ROWS和A-ROWS 中得到预测的行数和真实的行数 从而可以准确判断 [url=]Oracle[/url] 评估是否准确;虽然没有专门的输出运行时的相关统计信息 但是执行计划中的 BUFFERS 就是真实的逻辑读的数值。
缺陷
1. 必须要等到语句真正执行完毕后,才可以出结果,
*/


( 4 )dbms_xplan.display_cursor 获取
select * from table(dbms_xplan display_cursor '&sq_id'));
/*
优点:知道 sql id 立即可得到执行计划,它和 explain plan for 一样无须执行,但是它得到真实的执行计划。
缺陷:
1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况)
         2. 无法判断处理了多少行;
         3. 无法判断表被访问了多少次。

*/



(5 ) 事件10046 trace 跟踪
/*
步骤 1: alter session set events '10046 trace name context forever,level 12'; (开启跟踪)
步骤 2: 执行你的语旬
步骤 3: alter session set events '10046 trace name context off'; (关闭跟踪)
步骤 4: exit;(找到跟踪后产生的文件)

步骤 5: tkprof trc文件 目标文件 sys=no
sort=prsela,exeela,fchela(格式化命令)
优点: 1. 可以看出 SQL 语旬对应的等待事件,
          2. 如果 SQL 吾旬中有函数调用,函数中又有 SQL ,将会被列出,无处遁形,
          3. 可以方便地看出处理的行数,产生的物理逻辑读,
          4.可以方便地看出解析时间和执行时间
          5. 可以跟踪整个程序包。
缺陷
1. 步骤烦琐,比较麻烦;
          2. 无法判断表被访问了多少次,
          3. 执行计划中的谓词部分不能清晰地展现出来。
*/



(6 ) awrsqrpt.sql

/*
步骤1:@?/rdbms/admin/awrsqrpt.sql
步骤2
选择你要的断点( begin snap 和end ·snap)
步骤3
输入你的 sql_id
*/


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|湖南新梦想 ( 湘ICP备18019834号-2 )

GMT+8, 2022-5-18 12:19 , Processed in 0.040041 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表