首页 > 数据库 >Oracle获取执行计划的七种方法以及使用场景

Oracle获取执行计划的七种方法以及使用场景

时间:2023-10-21 16:02:02浏览次数:32  
标签:场景 七种 level SQL set sql Oracle 执行 id

一.explain plan for

select * from t1,t2
	where t1.id=t2.id
	and t1.id in(5,6);
select * from table(dbms_xplan.display());

Oracle获取执行计划的七种方法以及使用场景_oracle

  • 优点

无需真正执行,快捷方便

  • 缺点

1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次物理读,多少次递归调用等);
2.无法判断是处理了多少行;
3.无法判断表被访问了多少次。

  • 使用场景

跟踪某条SQL最简单的方法;
如果某SQL执行时间很长才能出结果,或无返回结果,这时使用此方法;
如果想要确保看到真实的执行计划,不能用此方法;

二 .set autotrace on

Oracle获取执行计划的七种方法以及使用场景_sql_02

  • 优点

1.可以输出运行时的相关统计信息(产生多少逻辑读,多少次物理读,多少次递归调用等);
2.虽然必须要等语句执行完毕后才可以输出执行计划,但可以使用traceonly控制返回结果不打印。

  • 缺点

1.必须要等语句真正执行完毕后,才可以输出结果;
2.无法看到表被访问了多少次。

  • 使用场景

跟踪某条SQL最简单的方法;
如果想要确保看到真实的执行计划,不能用此方法;

三 .statistics_level=all;

alter session set statistics_level=all;
执行SQL
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

Oracle获取执行计划的七种方法以及使用场景_sql_03

  • 优点

1.可以清晰的从STARTS得出表被访问多少次;
2.可以清晰的从E_ROWS和A-ROWS中得到预测的行数和真实的行数,从而可以准确的判断Oracle评估是否准确;
3.虽然没有专门的输出统计信息,但是执行计划中的BUFFERS就是真实的逻辑读次数,Reads表示物理读(本次SQL执行并未发生物理读,因此没有显示)。

  • 缺点

1.必须要等到语句真实执行完毕后才可以输出结果;
2.无法控制记录打印输出运行时的相关统计信息;
3.无法看出递归调用的次数。

  • 使用场景

想要获取表被访问的次数,只能用此方法;

四 .通过dbms_xplan.display_cursor输入sql_id参数直接获取

从共享池获得sql_id
select sql_id,sql_text from v$sql where sql_text like '%t1,t2%';
--或者通过其他方式获取到sql_id(比如awr)

select * from table(dbms_xplan.display_cursor('&sq_id'));

Oracle获取执行计划的七种方法以及使用场景_sql_04

  • 优点

1.知道sql_id立即可得到执行计划,和explain plan for 一样无需执行;
2.可以得到准确的执行计划

  • 缺点

1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次物理读,多少次递归调用等);
2.无法判断处理了多少行;
3.无法判断表被访问了多少次。

  • 使用场景

观察某条SQL有多条执行计划的情况,这时使用该方法;
如果某SQL执行时间很长才能出结果,可以使用此方法直接调用;

五. 使用10046跟踪

alter session set events '10046 trace name context forever,level 12';(开启跟踪)
执行SQL 
alter session set events '10046 trace name context off'; (关闭跟踪)

到$ORACLE_BASE/diag/rdbms/orcl11g/orcl11g/trace目录下找trace文件,
或者通过该SQL查询当前session的trace

select tracefile from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat));

tkprof prod_ora_69722.trc output=/home/oracle/20220419_prod_t1t2.txt sys=no waits=yes explain=fr/** (格式化命令)

level 1:SQL 语句,执行计划和执行状态
level 4:(level 1)的内容加上绑定变量信息
level 8:(level 1)的信息加上等待事件信息
level 12:(level 1)+(level 4)+(level 8)

Oracle获取执行计划的七种方法以及使用场景_执行计划_05

  • 优点

1.可以看出SQL语句对应的等待事件;
2.如果SQL语句中有函数调用,SQL中有SQL,都会被列出来;
3.可以方便的看出处理的行数,产生的物理逻辑读;
4.可以方便的看出解析时间和执行时间;
5.可以跟踪整个程序包。

  • 缺点

1.步骤繁琐,比较麻烦;
2.无法判断表被访问了多少次;
3.执行计划中的谓词部分不能清晰的展现出来。

  • 使用场景

如果SQL中含有函数,函数中套有SQL等多层调用,想准确分析只能使用此方法;
如果想要查看SQL产生的等待事件,需要使用此方法

六 .awrsqrpt.sql

在sqlplus中执行@?/rdbms/admin/awrsqrpt.sql,按照提示,输入相关信息即可获得报告。

Oracle获取执行计划的七种方法以及使用场景_sql_06

Oracle获取执行计划的七种方法以及使用场景_sql_07

  • 优点

可以观察具有多条执行计划的SQL,并且有详细的执行时间以及资源开销

  • 缺点

操作比较繁琐,需要将报告导出查看,有些环境限制无法导出。

  • 使用场景

同一条SQL有多个执行计划时,若进行分析,可以使用该方法;另外如果SQL含有中文字符,在sqlplus中显示乱码,可以使用该方式生成html格式的报告,即可正常显示中文字符。

 

七、使用sql_monitor 查看执行计划

使用v$sql_monitor,$sql_monitor是Oracle数据库中的一个视图,用于监控和分析正在执行的SQL语句的性能信息。该视图提供了丰富的性能信息,包括SQL语句的执行计划、执行时间、等待事件、I/O操作、锁等待、PGA和SGA使用情况等等。使用该视图可以帮助DBA或开发人员识别和定位SQL语句的性能瓶颈,并进行必要的优化和调整。

在使用该视图时,需要注意以下几点:

  • 该视图只对正在执行的SQL语句提供性能信息,因此需要在SQL语句执行期间进行监控;
  • 可以根据需要对该视图进行过滤,以便只显示特定的SQL语句或特定的会话信息;
  • 该视图中的性能信息可能会对系统性能产生一定的影响,因此需要谨慎使用,并根据需要进行采样或调整。 总之,v$sql_monitor 是Oracle数据库中非常有用的性能监控工具,可以帮助DBA或开发人员快速定位和解决SQL语句性能问题。
SELECT *
FROM v$sql_monitor
WHERE sql_id = 'your_sql_id';

在指定目录开启 http 服务,就可以通过 http://server-ip 在线查询生成的 HTML 报告:

set trimspool on
set arraysize 512
set trim on
set pagesize 0
set linesize 1000
set long 1000000
set longchunksize 1000000
spool active_sqlmon.html
select dbms_sqltune.report_sql_monitor(
  sql_id => 'bra35zf15vswf' , 
  report_level=>'ALL', 
  type=>'ACTIVE')
from dual;
spool off


#开启http服务
[root@Oracle19C oracle]# python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...
10.111.73.1 - - [15/Jun/2023 15:39:58] "GET /active_sqlmon.html HTTP/1.1" 200 -
10.111.73.1 - - [15/Jun/2023 15:40:02] "GET / HTTP/1.1" 200 -
10.111.73.1 - - [15/Jun/2023 15:40:04] "GET /active_sqlmon.html HTTP/1.1" 200 -
10.111.73.1 - - [15/Jun/2023 15:40:11] "GET /active_sqlmon.html HTTP/1.1" 200 -
10.111.73.1 - - [15/Jun/2023 15:40:13] "GET /active_sqlmon.html HTTP/1.1" 200 -

Oracle获取执行计划的七种方法以及使用场景_oracle_08

Oracle获取执行计划的七种方法以及使用场景_oracle_09

标签:场景,七种,level,SQL,set,sql,Oracle,执行,id
From: https://blog.51cto.com/u_13482808/7967828

相关文章

  • oracle怎样分批查询
    在Oracle中,分批查询通常是通过使用"分页"的方式来实现的。可以使用ROWNUM伪列、OFFSET关键字和FETCHFIRST关键字来完成分页查询。具体地,可以使用如下的SQL语句进行分页查询:SELECT*FROM(SELECTA.*,ROWNUMRNFROM(SELECT*FROMyour_tableWH......
  • Oracle数据库中文显示乱码
    问题sql脚本导入到Oracle数据库,中文数据显示乱码。原因本地环境没有配置数据库编码格式,需要跟服务器上数据库编码格式统一。解决方法1.查询数据库编码格式,使用Selectuserenv('language')fromdual语句查询数据库编码格式。2.在**系统环境变量**配置:N......
  • typeorm oracle 表大小写问题
    oracle对于表名的定义包含了是否包含双引号的问题,但是默认typeorm创建的是包含了双引号的,造成数据查询会有问题(typeorm自身没有问题,但是外部查询会有问题)解决方法自定义命名策略参考 classOracleNameStrategyextendstypeorm.DefaultNamingStrategy{......
  • Oracle 查询排名第几到第几行的数据(rownumber效率最高)
    查询排名第5到第10行的数据  实现效率最高,如果是在前端页面用循环选择,效率是很慢的。ROWNUM是Oracle加在查询数据集的伪字段,记录的是每一行的行号。--第三步查询需要的几行数据SELECTA.NAME,A.FW_TIMESTAMPFROM(--第二步加排序编号ROWNUMSELECTA.NAME,A.FW_TIMES......
  • 企业数据泄密场景有哪些?如何斩断员工泄密风险?
    企业数据泄露事件频频发生、屡禁不止,根据美国威瑞森通信公司(Verizon)《2023DataBreachInvestigationsReport》,由外部攻击导致的数据泄露事件中,95%的外部攻击是以金钱利益为驱使的。同样,闪捷发布的《2021年度数据泄漏态势分析报告》中也显示,近80%的数据泄露事件动机是为了获取利......
  • 国标GB28181视频平台EasyGBS国标视频监控平台的特点及其应用场景
    ​EasyGBS是一款基于国标GB28181协议的视频云服务平台,支持多路设备同时接入,并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。能将GB/T28181备/平台推送的PS流转ES流,并提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式视频流的分发服务,实现Web浏览器、......
  • Oracle集群升级迁移—主机网络设置及交换机侧bond vlan划分
    目录Oracle集群升级迁移—主机网络设置及交换机bondvlan划分网络规划操作系统层面的IP设置bond类型介绍设置bond1和bond0交换机侧的设置(省略)Oracle集群升级迁移—主机网络设置及交换机bondvlan划分网络规划按照工程师要求,配置了5个IP供集群使用。1个IP为ScanIP、2个IP为VIP......
  • Grafana监控OracleDB的完整过程
    背景两年前曾经写过一个进行Oracle监控的简单blog但是周天晚上尝试进行处理时发现很不完整了.很多数据获取不到.晚上又熬夜了好久进行处理.感觉还是需要总结一下,不然就忘记了获取镜像还是使用docker的方式来暴露Oracle的服务使用的镜像为:dockerpullghcr.io/iamseth/or......
  • oracle TDE使用(mkstore方式)
    环境:Os:Centos7DB:11.2.0.4 1.先要创建一个"wallet钱包",这个钱包里面保存着密钥,Oracle就是通过这个密钥对列进行加密和解密的.su-oracle[oracle@rac01~]$mkdir$ORACLE_BASE/wallet[oracle@rac01~]$cd$ORACLE_BASE/wallet[oracle@rac01wallet]$pwd/u01/oracle/a......
  • 浅谈AI人体姿态识别技术的先进性及安防视频监控应用场景
    随着计算机视觉技术和安防监控技术的不断发展,基于AI算法的人体姿态识别技术也得到了广泛的应用。然而,传统的安防监控系统通常只局限于简单的视频监控等功能,无法准确地识别人体的姿态,使得一些安防监控存在着一定的漏洞和不足之处。基于AI算法的人体姿态识别技术是基于人工智能和计......