Oracle性能分析1:开启SQL跟踪和获取trace文件
当Oracle查询出现效率问题时,我们往往须要了解问题所在,这样才干针对问题给出解决方式。Oracle提供了SQL运行的trace信息,当中包括了SQL语句的文本信息。一些运行统计,处理过程中的等待,以及解析阶段(如生成运行计划)产生的信息。
这些信息有助于你分解sql语句的服务时间和等待时间,并了解所用资源和同步点的具体信息,从而帮助你诊断存在的性能问题。
这篇文章介绍了怎么开启SQL跟踪和获取trace文件,具体信息例如以下。
开启SQL跟踪
从内部技术细节看,SQL跟踪是基于10046调试事件的,以下是支持的等级:
0
禁止调试事件
1
调试事件是激活的。
针对每一个被处理的数据库调用。给定例如以下信息:SQL语句、响应时间、服务时间
处理的行数、处理的行数、逻辑读数量、物理读与写的数量、运行计划以及一些额外信息
4
假设等级1。包含绑定变量的额外信息。
主要是数据类型、精度以及每次运行时所用的值
8
同等级1。加上关于等待时间的细节信息。为了处理过程中的每一个等待,提供例如以下信息:等待时间的名字、持续时间,以及一些额外的參数,可标明所等待的资源
12
同一时候启动等级4和等级8
在Oracle 9i或者之前,以下SQL语句针对所在会话激活SQL跟踪:
alter session set sql_trace = true
还可通过dbms_session包中的set_sql_trace存储过程,或者通过dbms_system包的set_sql_tarce_in_session存储过程方法,但这些都仅仅是在等级1激活SQL跟踪,在实践中用处不大,就不详述了。
更实用的是指定级别的方式,以下是对所在会话開始等级12的SQL跟踪:
alter session set events '10046 trace name context forever, level 12'
相应的对所在会话禁止SQL跟踪的语句例如以下:
alter session set events '10046 trace name context off'
也能够通过dbms_system包中的set_ev存储过程。这里也不详述了,我以下重点讲讲Oracle 10g之后提供的方法。
Oracle 10g之后提供了dbms_monitor包来开启或关闭SQL跟踪。提供了在会话、client、组件以及数据库层级开启SQL跟踪方法。注意仅仅有dba角色的用户才同意使用。
会话级
以下的PL/SQL为ID为122。序列号为6734的会话开启第8级的SQL跟踪:
begin
dbms_monitor.session_trace_enable(session_id => 122,
serial_num => 6734,
waits => true,
binds => false);
end;
session_id
session标识。相应v$session视图中的SID列。以下是获取当前会话id的方法:
select userenv('sid') from dual
serial_num
相应v$session视图中的SERIAL#列,因为SID会重用。当SID被重用时,SERIAL#添加。获取方法例如以下:
select serial# from v$session where sid = 122
waits
相应v$session视图中的SQL_TRACE_WAITS,表示等待事件跟踪是否被激活,默觉得true。
binds
相应v$session视图中的SQL_TRACE_BINDS,表示绑定跟踪是否被激活。默认false。
当运行成功后。v$session视图中的SQL_TRACE被改动为ENABLED,SQL_TRACE_WAITS和SQL_TRACE_BINDS为你设置的相应值。
以下的PL/SQL用于关闭SQL跟踪:
begin
dbms_monitor.session_trace_disable(session_id => 122, serial_num => 6734);
end;
client级
以下的PL/SQL调用为全部具有指定client标记的会话开启第8级的SQL跟踪:
begin
dbms_monitor.client_id_trace_enable(client_id => 'test',
waits => true,
binds => false);
end;
须要注意client标记区分大写和小写,能够通过以下的方法看是否设置成功:
select primary_id as client_id, waits, binds
from dba_enabled_traces
where trace_type = 'CLIENT_ID'
当设置成功后,每次查询前指定相应的client标记就能够开启SQL跟踪,指定client标记的方法例如以下:
begin
DBMS_SESSION.SET_IDENTIFIER('test');
end;
//该会话的SQL跟踪已经开启
当你为一个session设置了标记后,能够在v$session的client_identifier列查看该标记。
以下的PL/SQL用于关闭SQL跟踪:
begin
dbms_monitor.client_id_trace_disable(client_id => 'test');
end;
组件级
以下的PL/SQL调用为全部具有指定client标记的会话开启第8级的SQL跟踪:
begin
dbms_monitor.serv_mod_act_trace_enable(service_name => 'ly',
module_name => 'PL/SQL Developer',
action_name => 'SQL 窗体 - 新建',
waits => true,
binds => false,
instance_name => null);
end;
參数中的service_name相应v$session视图的service_name,module_name相应v$session视图的的module,action_name相应v$session视图的action。查询方式例如以下:
SELECT sid, serial#,
client_identifier, service_name, action, module
FROM V$SESSION
设置之后能够通过例如以下方法查看设置:
select primary_id as service_name,
qualifier_id1 as module_name,
qualifier_id2 as action_name,
waits,
binds
from dba_enabled_traces
where trace_type = 'SERVICE_MODULE_ACTION'
以下的PL/SQL用于关闭SQL跟踪:
begin
dbms_monitor.serv_mod_act_trace_disable(service_name => 'ly',
module_name => 'PL/SQL Developer',
action_name => 'SQL 窗体 - 新建',
instance_name => null);
end;
数据库级
以下的PL/SQL调用开启了数据库的12级SQL跟踪:
begin
dbms_monitor.database_trace_enable(waits => true,
binds => true,
instance_name => null);
end;
以下的方法查看设置是否成功:
select instance_name,
waits,
binds
from dba_enabled_traces
where trace_type = 'DATABASE'
以下的PL/SQL用于关闭SQL跟踪:
begin
dbms_monitor.database_trace_disable(instance_name => null);
end;
trace文件里的计时信息
以下的语句用于为trace文件提供计时信息:
alter session set timed_statistics = true
普通情况下默认都为true,假设不提供计时信息。trace文件就没有什么用了,因此开启SQL跟踪之前,最好确认一下參数被设置为true。
获取生成的trace文件
开启SQL跟踪后。会生成一个trace文件,通过初始化參数user_dump_dest配置其所在文件夹,该參数的值能够通过以下方法获取到:
select name, value from v$parameter where name = 'user_dump_dest'
但假设我们须要定位到详细的文件。则须要了解trace文件的命名。trace文件的名字是独立于版本号和平台的,在大部分常见的平台下。命名结构例如以下:
{instance name}_{process name}_{process id}.trc
1)instance name
初始化參数instance_name的小写值。通过v$instance视图的instance_name列能够得到这个值。
2)process name
产生跟踪文件进程的名字的小写值。对于专有服务器进程。使用ora,对于共享服务器进程,能够通过v$diapatcher或v$shared_server视图的name列获得。对于并行从属进程,能够通过v$px_process视图server_name列获得。对于其它多数后台进程来说。能够通过v$bgprocess视图的name列获得。
3)process id
操作系统层面的进程标记。
这个值能够通过v$process视图的spid列获取。
依据这些信息,能够通过以下的方式获取trace文件名称:
select s.SID,
s.SERVER,
lower(case
when s.SERVER in ('DEDICATED', 'SHARED') then
i.INSTANCE_NAME || '_' || nvl(pp.SERVER_NAME, nvl(ss.NAME, 'ora')) || '_' ||
p.SPID || '.trc'
else
null
end) as trace_file_name
from v$instance i,
v$session s,
v$process p,
v$px_process pp,
v$shared_server ss
where s.PADDR = p.ADDR
and s.SID = pp.SID(+)
and s.PADDR = ss.PADDR(+)
and s.TYPE = 'USER'
and s.SID = 'your sid'
order by s.SID
将上面的'your sid'替换为你的session的sid就能够查出指定session生成的trace文件的名字,session的sid在v$session视图中得到,或者直接查询当前session的sid:
select userenv('sid') from dual
将路径(user_dump_dest)和文件名称结合在一起。我们就得到了trace文件的完整路径。
而在Oracel 11g中。查询当前会话生成的trace文件则很easy:
select value from v$diag_info where name = 'Default Trace File'
Oracle性能分析1:开启SQL跟踪和获取trace文件的更多相关文章
- Oracle性能分析12:对象统计信息
对象统计信息描写叙述数据是如何在数据库中存储的,查询优化器使用这些统计信息来做出正确的决定.Oracle中有三种类型的对象统计信息:表统计.列统计和索引统计.而在每种类型中,有细分为:表或索引级别的统 ...
- Oracle性能分析3:TKPROF简介
tkprof它是Oracle它配备了一个命令直插式工具,其主要作用是将原始跟踪文件格文本文件的类型,例如,最简单的方法,使用下面的: tkprof ly_ora_128636.trc ly_ora_1 ...
- Oracle 性能相关常用脚本(SQL)
在缺乏的可视化工具来监控数据库性能的情形下,常用的脚本就派上用场了,下面提供几个关于Oracle性能相关的脚本供大家参考.以下脚本均在Oracle 10g测试通过,Oracle 11g可能要做相应调整 ...
- PostgreSQL CPU占用100%性能分析及慢sql优化
查看连接数变化 CPU利用率到达100%,首先怀疑,是不是业务高峰活跃连接陡增,而数据库预留的资源不足造成的结果.我们需要查看下,问题发生时,活跃的连接数是否比平时多很多.对于RDS for PG,数 ...
- Oracle性能分析11:系统统计信息
早期Oracle查询优化器的开销计算是基于运行SQL语句所须要的物理读,这种方法被叫做I/O开销模式(I/O cost model),这种方法的主要缺点是觉得单块读和多块读开销相当.在Oracle 8 ...
- Oracle性能分析7:创建索引
在创建索引时,我们往往希望可以预估索引大小,以评估对现有project环境的影响,我们也希望创建索引的过程可以最小化的影响我们正在执行的project环境,并能查看索引的状况. 预估索引大小 预估索引 ...
- Oracle 性能分析
1.--查出耗时长的 10条SQL select * from (select v.sql_id, v.child_number, v.sql_text, v.elapsed_time, v.cpu_ ...
- Oracle 性能调优 SQL_TRACE
思维导图 Oracle优化10-SQL_TRACE解读 Oracle优化11-10046事件 概述 当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起 ...
- Oracle 性能调优 10053事件
思维导图 10053事件概述 我们在查看一条SQL语句的执行计划时,只看到了CBO最终告诉我们的执行计划结果,但是我们并不知道CBO为何要这样做. 特别是当执行计划明显失真时,我们特别想搞清楚为什么C ...
随机推荐
- FastDFS原理系列文章
FastDFS原理系列文章 基于FastDFS 5.03/5.04 2014-12-19 一.概述 FastDFS文档极少,仅仅能找到一些宽泛的架构文档,以及ChinaUnix论坛上作者对网友提问的一 ...
- 安装ftp碰到的问题及解决方法
1 CRT显示乱码: 本地windows机器.改动SecureCRT的设置.找到"选项"->"会话选项"->"外观" ...
- 杭电1018-Big Number(大数)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- hdu3966_树链剖分
近期在强化知识点深度.发现树链剖分不是非常会写了. 回想一下改动操作: 若两个点在同一条链上,则直接改动这段区间. 若不在同一条链上,改动深度较大的点到其链顶端的区间,同一时候将这个点变为他所在链顶端 ...
- BZOJ 1790: [Ahoi2008]Rectangle 矩形藏宝地
BZOJ 1790: [Ahoi2008]Rectangle 矩形藏宝地 题目传送门 [题目大意] 游戏的主办方把这块开阔地当作第一象限,将所有可能埋藏宝藏的地方划成一个个矩形的土地,并把这些矩形土地 ...
- bzoj1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...
- Oracle实例和Oracle数据库(Oracle体系结构)---转载
对于初接触Oracle 数据库的人来讲,很容易混淆的两个概念即是Oracle 实例和Oracle 数据库.这两 概念不同于SQL sever下的实例与数据库,当然也有些相似之处.只是在SQL serv ...
- 32.QT绘图
widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPainter> #inclu ...
- SVN——Jenkins自动发布
最近公司项目处于开发阶段,很多功能开发完后就需要发布到测试环境等待测试去验收,这个时候如果手动更新网站的话,是很费时费力的. 于是乎,我们做成了自动发布,这样我们只管提交代码到SVN就行了,发布由软件 ...
- 【转自网络】JS实现保存当前网页HTML到本地
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...