使用ALTER SESSION or DBMS_SESSION启用SQL跟踪

2023年 8月 23日 73.3k 0

SQL Language Reference手册中记录着ALTER SESSION语句,可用来启用SQL 跟踪。请看下例:
ALTER SESSION SET sql_trace =TRUE

你仅可以使用ALTER SESSION语句将sql_trace设置为TRUE, 这相当于级别1。在实际工作中,级别1通常是不够的。在大多数情况下,你需要把响应时间彻底拆开,以弄清楚瓶颈到底在哪里。基于这个原因,我不会再过多介绍这种启用SQL跟踪的方法。

我要介绍的是Oracle Support文档EVENT: 10046 “enable SQL statement tracing(including binds/waits)”(21154.1)中介绍的可以启用任何级别SQL跟踪的方法。要启用和禁用任意级别的SQL 跟踪,需要执行ALTER SESSION语句来设置事件的初始化参数。

下面的sql 是在当前会话启动级别12的sql 跟踪,请注意事件编号和级别的写法。
alter session set events '10046 trace name context forever, level 12';

接下来的sql 会禁用sql 跟踪,请注意这里不是通过指定为级别0来禁用。
alter session set events '10046 trace name context off';

你也可以使用ALTER SYSTEM语句来设置事件初始化参数。该语句的语法和ALTER SESSION是一样的。任何情况下,在系统级别设置SQL 跟踪都是没有意义的,此外这么做还会造成庞大的开销。请注意,这只对启用SQL 跟踪后的会话有效。

使用DBMS_SESSION启用SQL跟踪
之前曾指出,默认情况下访问包dbms_monitor是有限制的。如果想为当前连接的会话启用或禁用SQL跟踪,但你既没有包dbms_monitor的执行权限,又不想执行ALTER SESSION语句(比如,因为语法很难记),则可以使用包dbms_session。

包dbms_session包含两个过程:session_trace_enable和session_trace_disable,它们的功能与包dbms_monitor下的同名过程一致。唯一的区别就是,dbms_session下的过程只能为当前连接的会话启用或禁用SQL跟踪。因此,拥有执行ALTER SESSION语句权限的任何用户都可以使用这两个过程。

下面举例说明如何使用dbms_session启用和禁用SQL跟踪。注意视图v$session提供的输出表明SQL跟踪已经启用:
BEGIN
dbms_session.session_trace_enable(
waits=>TRUE,
binds=>TRUE,
plan_stat=>'all_executions');
END;
/

SELECT sql_trace,sql_trace_waits,sql_trace_binds,sql_trace_plan_stats
FROM v$session
WHERE sid=sys_context('userenv','sid');

BEGIN
dbms_session.session_trace_disable;
END;
/

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论