linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux数据库 >

Oracle 11g R2性能优化 SQL TRACE

时间:2019-02-16  来源:未知  作者:admin666

正文

作为Oracle官方自带的一种基本性能诊断工具,SQL Trace可以用来评估当前正在运行的SQL语句的效率,同时为该语句生成统计信息等,并保存这些信息到指定路径下的跟踪文件(trace)当中。SQL Trace会将一条SQL语句或者PL/SQL包执行过程全部输出到跟踪文件(trace)当中,可以通过分析跟踪文件(trace)来分析SQL语句的执行效率并进行性能诊断与优化。

通常来说trace文件的内容不易于理解与阅读,Oracle官方还提供了工具tkprof对trace文件进行格式化处理,本文不讨论tkprof工具的使用。之前在工作中也有使用过SQL Trace进行SQL语句的跟踪诊断,但都没有进行完整的总结,本文就SQL Trace工具的使用进行梳理。

操作系统(OS):CentOS Linux release 7.5.1804 (Core) 数据库版本(Oracle Database):Oracle Database 11g R2(11.2.0.4.0)

同时配置了示例SCHEMA和解锁了用户SCOTT、HR。

开启SQL Trace有如下几种场景与方式:

当前会话开启跟踪本会话; 当前会话开启跟踪其他会话; 使用DBMS_MONITOR包来开启跟踪; 根据登录触发器来开启跟踪。 当前会话跟踪

最简单的方法是在SQL*PLUS当中执行如下语句:

-- 配置trace文件的标识符便于寻找定位
SYS@dbabd alter session set tracefile_identifier = dbabd;
-- 开启当前会话跟踪
SYS@dbabd alter session set sql_trace = true;

通过运行以上语句就开启了当前会话的跟踪,trace文件位于 $ORACLE_BASE/diag/rdbms/dbabd/dbabd/trace目录下:

$ pwd
/data/app/oracle/diag/rdbms/dbabd/dbabd/trace
$ ls *DBABD*
dbabd_ora_27978_DBABD.trc dbabd_ora_27978_DBABD.trm

以上得到trace文件当中并不包含绑定变量值,也不包含等待事件信息,如果需要这些信息,可以使用DBMS_SESSION包来开启跟踪,前提是用户必须有ALTER SESSION权限,否则会报ORA-01031: insufficient privileges错误。关于DBMS_SESSION包的用法可以参考官方文档:DBMS_SESSION

如果事先没有配置trace文件的标识符,则可以通过以下语句进行定位:

-- 语句
select tracefile
 from v$session s
 join v$process p
 on p.addr = s.paddr
 where s.audsid = USERENV('SESSIONID');
-- 结果
SYS@dbabd select tracefile
 2 from v$session s
 3 join v$process p
 4 on p.addr = s.paddr
 5 where s.audsid = USERENV('SESSIONID');
TRACEFILE
----------------------------------------------------------------------------------------------------
/data/app/oracle/diag/rdbms/dbabd/dbabd/trace/dbabd_ora_27978_DBABD.trc

有时需要确认当前会话是否开启了跟踪,可以使用如下语句查询:

-- 语句
select s.sql_trace,
 s.sql_trace_waits,
 s.sql_trace_binds,
 traceid,
 tracefile
 from v$session s
 join v$process p
 on p.addr = s.paddr
 where s.audsid = USERENV('SESSIONID');
-- 结果
SYS@dbabd select s.sql_trace,
 2 s.sql_trace_waits,
 3 s.sql_trace_binds,
 4 traceid,
 5 tracefile
 6 from v$session s
 7 join v$process p
 8 on p.addr = s.paddr
 9 where s.audsid = USERENV('SESSIONID');
SQL_TRACE SQL_TRACE_WAITS SQL_TRACE_BINDS TRACEID TRACEFILE
---------- --------------- --------------- ---------- ------------------------------------------------------------
ENABLED FALSE FALSE DBABD /data/app/oracle/diag/rdbms/dbabd/dbabd/trace/dbabd_ora_2797
 8_DBABD.trc

如果需要关闭当前会话跟踪,则执行如下语句:

SYS@dbabd alter session set sql_trace = false;
其他会话跟踪

如果是通过当前会话开启对其他会话的跟踪,一般都由DBA通过SYS用户操作,可以使用DBMS_SYSTEM包当中一个存储过程SET_SQL_TRACE_IN_SESSION,前提是需要获取到会话的SID和SERIAL#。

查看DBMS_SYSTEM包当中的结构
SYS@dbabd desc dbms_system
PROCEDURE SET_EV
 Argument Name Type In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SI BINARY_INTEGER IN
 SE BINARY_INTEGER IN
 EV BINARY_INTEGER IN
 LE BINARY_INTEGER IN
 NM VARCHAR2 IN
PROCEDURE SET_SQL_TRACE_IN_SESSION
 Argument Name Type In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SID NUMBER IN
 SERIAL# NUMBER IN
 SQL_TRACE BOOLEAN IN
获取其他会话的SID和SERIAL#
SYS@dbabd select sid,SERIAL#,username from v$session where username is not null;
 SID SERIAL# USERNAME
---------- ---------- ------------------------------------------------------------------------------------------
 125 17 SYS
 141 45 SCOTT

实际环境当中可能出现同一个用户有多个会话存在,需要根据v$session视图当中的其他选项进行判断,这里假设只有一个SCOTT用户会话。

开启对SCOTT用户会话的跟踪
SYS@dbabd begin
 2 dbms_system.SET_SQL_TRACE_IN_SESSION(SID = 141,
 3 SERIAL# = 45,
 4 SQL_TRACE = true
 5 );
 6 end;
PL/SQL procedure successfully completed.
SYS@dbabd exec dbms_system.SET_SQL_TRACE_IN_SESSION(141,45,true);
PL/SQL procedure successfully completed.
定位跟踪的trace文件
SYS@dbabd select s.sql_trace,
 2 s.sql_trace_waits,
 3 s.sql_trace_binds,
 4 traceid,
 5 tracefile
 6 from v$session s
 7 join v$process p
 8 on p.addr = s.paddr
 9 where s.sid = 141;
SQL_TRACE SQL_TRACE_WAITS SQL_TRACE_BINDS TRACEID TRACEFILE
---------- --------------- --------------- ---------- ------------------------------------------------------------
ENABLED FALSE FALSE SCOTT /data/app/oracle/diag/rdbms/dbabd/dbabd/trace/dbabd_ora_1014
 _SCOTT.trc
关闭对SCOTT用户会话的跟踪
SYS@dbabd exec dbms_system.SET_SQL_TRACE_IN_SESSION(141,45,false);
PL/SQL procedure successfully completed.
DBMS_MONITOR包跟踪

无论是跟踪当前会话或者其他会话都可以采用DBMS_MONITOR包当中的SESSION_TRACE_ENABLE存储过程。跟踪其他会话的前提还是需要获取到会话的SID和SERIAL#,关闭则使用包当中的SESSION_TRACE_DISABLE存储过程。

存储过程SESSION_TRACE_ENABLE参数需求如下,详细可参考官方文档:SESSION_TRACE_ENABLE Procedure

PROCEDURE SESSION_TRACE_ENABLE
 Argument Name Type In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SESSION_ID BINARY_INTEGER IN DEFAULT -- 对应SID
 SERIAL_NUM BINARY_INTEGER IN DEFAULT -- 对应SERIAL#
 WAITS BOOLEAN IN DEFAULT -- 对应是否加入等待事件跟踪
 BINDS BOOLEAN IN DEFAULT -- 对应是否加入绑定变量跟踪
 PLAN_STAT VARCHAR2 IN DEFAULT -- 对应跟踪转储行数据频率,取值参考官方文档

存储过程SESSION_TRACE_DISABLE参数需求如下,详细可参考官方文档:SESSION_TRACE_DISABLE Procedure

PROCEDURE SESSION_TRACE_DISABLE
 Argument Name Type In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SESSION_ID BINARY_INTEGER IN DEFAULT
 SERIAL_NUM BINARY_INTEGER IN DEFAULT

从以上两个存储过程所需参数来看,如果是跟踪当前会话的话可以省略SESSION_ID和SERIAL_NUM这两个参数,具体的开启和关闭语句可以参考其他会话跟踪当中的DBMS_SYSTEM包使用方法。

当前数据库跟踪

使用DBMS_MONITOR包还可以用来开启整个数据库的跟踪,但是这会造成trace文件异常庞大,不便于定位具体问题,而且也会造成一定的性能损失,所以通常不建议开启。

采用SQL语句方式:

-- 开启
SYS@dbabd alter system set sql_trace = true;
-- 关闭
SYS@dbabd alter system set sql_trace = false;

采用DBMS_MONITOR包方式,主要使用DATABASE_TRACE_ENABLE和DATABASE_TRACE_DISABLE两个存储过程:

PROCEDURE DATABASE_TRACE_ENABLE
 Argument Name Type In/Out Default?
 ------------------------------ ----------------------- ------ --------
 WAITS BOOLEAN IN DEFAULT
 BINDS BOOLEAN IN DEFAULT
 INSTANCE_NAME VARCHAR2 IN DEFAULT
 PLAN_STAT VARCHAR2 IN DEFAULT
PROCEDURE DATABASE_TRACE_DISABLE
 Argument Name Type In/Out Default?
 ------------------------------ ----------------------- ------ --------
 INSTANCE_NAME VARCHAR2 IN DEFAULT
-- 开启
SYS@dbabd exec dbms_monitor.DATABASE_TRACE_ENABLE(true,true,'dbabd','all_executions');
-- 关闭
SYS@dbabd exec dbms_monitor.DATABASE_TRACE_DISABLE('dbabd');
采用登录触发器跟踪

可以通过创建登录触发器来跟踪某个用户的SQL执行效率情况,登录触发器会在会话初始化的时候去执行,触发器可以根据指定条件是否对这次会话开启跟踪,以下登录触发器是以SCOTT用户为例,为SCOTT用户登录的所有会话设置合适的trace文件标识符并开启跟踪。

-- 创建触发器SCOTT_LOGIN_TRACE语句
create or replace trigger scott_login_trace
 after logon on database 
begin
 if user = 'SCOTT'
 then
 execute immediate 'alter session set tracefile_identifier = SCOTT';
 dbms_session.session_trace_enable(waits = true, binds = true, plan_stat = 'all_executions');
 end if;
/

使用SYS用户进行创建:

SYS@dbabd create or replace trigger scott_login_trace
 2 after logon on database
 3 begin
 4 if user = 'SCOTT'
 5 then
 6 execute immediate 'alter session set tracefile_identifier = SCOTT';
 7 dbms_session.session_trace_enable(waits = true,
 8 binds = true,
 9 plan_stat = 'all_executions'
 10 );
 11 end if;
 12 end;
 13 /
Trigger created.

查看触发器状态:

SYS@dbabd select owner,trigger_name,status,trigger_body from all_triggers where owner = 'SYS' and trigger_name = 'SCOTT_LOGIN_TRACE';
OWNER TRIGGER_NAME STATUS TRIGGER_BODY
---------- -------------------- ---------- --------------------------------------------------------------------------------
SYS SCOTT_LOGIN_TRACE ENABLED begin
 if user = 'SCOTT'
 then
 execute immediate 'alter session set tracefile_identifier = SCOTT';
 dbms_session.session_trace_enable(waits = true, binds = true, plan_stat = 'all_executions');
 end if;
 end;

创建完触发器之后,SCOTT用户只要一登录就会默认开启跟踪。

以上梳理了常见的开启SQL TRACE的几种方式,但是原始的trace文件可读性比较差,通常不会直接去读取,而是通过工具tkprof进行格式化之后进行阅读,关于tkprof的使用可以参考我另一篇博文:Oracle 11g R2性能优化 tkprof

https://docs.oracle.com/cd/E11882_01/server.112/e41573/sqltrace.htm
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sessio.htm
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_monitor.htm

更多Oracle相关信息见Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

友情链接
  • Mozilla发布Firefox 67.0.4,修复沙箱逃逸漏洞
  • 蚂蚁金服正式成为CNCF云原生计算基金会黄金会员
  • Firefox 68将采用Microsoft BITS安装更新
  • OpenSSH增加对存储在RAM中的私钥的保护
  • 谷歌想实现自己的curl,为什么?
  • Raspberry Pi 4发布:更快的CPU、更大的内存
  • Firefox的UA将移除CPU架构信息
  • Ubuntu放弃支持32位应用程序实属乌龙,Steam会否重回Ubuntu怀抱
  • Qt 5.13稳定版发布:引入glTF 2.0、改进Wayland以及支持Lottie动
  • 红帽企业Linux 7现已内置Redis 5最新版
  • Slack进入微软内部禁用服务清单,GitHub也在其列?
  • 安全的全新编程语言V发布首个可用版本
  • Windows Terminal已上架,快尝鲜
  • 阿里巴巴微服务开源生态报告No.1
  • 面世两年,Google地球将支持所有基于Chromium的浏览器
  • 推进企业容器化持续创新,Rancher ECIC千人盛典完美收官
  • CentOS 8.0最新构建状态公布,或于数周后发布
  • Debian移植RISC
  • 微软拆分操作系统的计划初现雏形
  • Oracle发布基于VS Code的开发者工具,轻松使用Oracle数据库
  • Ubuntu 19.10停止支持32位的x86架构
  • 微软为Windows Terminal推出全新logo
  • 联想ThinkPad P系列笔记本预装Ubuntu系统
  • 微软发布适用于Win7/8的Microsoft Edge预览版
  • 启智平台发布联邦学习开源数据协作项目OpenI纵横
  • 经过六个多月的延迟,微软终于推出Hyper
  • ZFS On Linux 0.8.1 发布,Python可移植性工作
  • DragonFly BSD 5.6.0 发布,HAMMER2状态良好
  • Linux Kernel 5.2
  • CentOS 8.0 看起来还需要几周的时间
  • 百度网盘Linux版正式发布
  • PCIe 6.0宣布:带宽翻倍 狂飙至256GB/s
  • PHP 7.4 Alpha 发布,FFI扩展,预加载Opcache以获得更好的性能
  • Canonical将在未来的Ubuntu版本中放弃对32位架构的支持
  • Scala 2.13 发布,改进的编译器性能
  • 微软的GitHub收购了Pull Panda,并且使所有订阅完全免费
  • Windows Subsystem for Linux 2 (WSL 2)现在适用于Windows 10用
  • Debian 10 “Buster”的RISC
  • MariaDB宣布发布MariaDB Enterprise Server 10.4
  • DXVK 1.2.2 发布,带来微小的CPU开销优化
  • DragonFlyBSD 5.6 RC1 发布,VM优化,默认为HAMMER2
  • PrimeNG 8.0.0 发布,支持Angular 8,FocusTrap等
  • GIMP 2.10.12 发布,一些有用的改进
  • 清华大学Anaconda 镜像服务即将恢复
  • Debian GNU/Linux 10 “Buster” 操作系统将于2019年7月6日发布
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载