oracle怎么跟踪过程的执行需要建立一张表来记录
explain plan SET statement_id='name' FOR (这里是你要调试的语句 )
SELECT
A.OPERATION,
OPTIONS,
OBJECT_NAME,
OBJECT_TYPE,
ID,
PARENT_ID
FROM
PLAN_TABLE A
WHERE
STATEMENT_ID='name'
ORDER BY
Id;
ID 'name'是一个标识,你可以自己取,字段有很多个,以下是各个字段的解释(可能格式不对,你可以复制后看):
字段名字段类型含义
STATEMENT_IDVARCHAR2(30)explain PLAN 语句中所指定的最优STATEMENT_ID 参数值, 如果在EXPLAN PLAN语句中没有使用SET STATEMENT_ID,那么此值会被设为NULL 。
REMARKSVARCHAR2(80)与被解释规划的各步骤相关联的注释最长可达80 字节
OPERATIONVARCHAR2(30)各步骤所执行内部操作的名称在某条语句所产生的第一行中该列的可能取值如下DELETE STATEMENT INSERT STATEMENT SELECT STATEMENT UPDATE STATEMENT
OPTIONSVARCHAR2(30)对OPERATION 列中所描述操作的变种
OBJECT_NODEVARCHAR2(128)用于访问对象的数据库链接database link 的名称对于使用并行执行的本地查询该列能够描述操作中输出的次序
OBJECT_OWNERVARCHAR2(30)对于包含有表或索引的架构schema 给出其所有者的名称
OBJECT_NAMEVARCHAR2(30)表或索引的名称
OBJECT_INSTANCEINTEGER根据对象出现在原始original 语句中的次序所给出的相应次序编号就原始的语句文本而论其处理顺序为自左至右自外向内景象扩张view
OBJECT_TYPEVARCHAR2(30)用于提供对象描述性信息的修饰符例如索引的NON-UNIQUE
OPTIMIZERVARCHAR2(255)当前优化程序的模式
IDINTEGER分配给执行规划各步骤的编号
PARENT_IDINTEGER对ID 步骤的输出进行操作的下一个执行步骤的ID
POSITIONINTEGER对于具有相同PARENT_ID 的步骤其相应的处理次序
COSTINTEGER根据优化程序的基于开销的方法所估计出的操作开销值对于使用基于规则方法的语句该列为空该列值没有特定的测量单位它只是一个用于比较执行规划开销大小的权重值
CARDINALITYINTEGER根据基于开销的方法对操作所访问行数的估计值
BYTESINTEGER根据基于开销的方法对操作所访问字节的估计
=============================================
你按照我说的做 , 后面用
SELECT
*
FROM
PLAN_TABLE A
WHERE
STATEMENT_ID='name'
结果已经很清楚了,全部满足你的要求 。
各列的具体含义上面已经给出 。
oracle SQL跟踪 , 如何跟踪某个用户发出的所有SQL?需要打开oracle审计功能才能记录,并且消耗一定性能 。
简单打开审计如下
1、设置参数
alter system set audit_trail=db scope=spfile;
2、重启数据库
3、打开相应的审计(审计选项很多),如,对用户test对表操作的审计
audit table by test;
4、以dba查看审计记录
select * from dba_audit_trail;
Oraclesql 前言
sql_trace 是我在工作中经常要用到的调优工具 相比较statspack 我更愿意用这个工具
因为数据库慢原因的 %以上是由于sql问题造成的 statspack没有sql的执行计划 显示没有它直观 方便 对想要针对性不强
介绍数据库调优需要经常会用到的工具 可以很精确地跟抓取相关session正在运行的sql 再通过tkprof分析出来sql的执行计划等相关信息 从而判断那些sql语句存在问题
统计如下信息(摘字官方文档)
Parse execute and fetch counts
CPU and elapsed times
Physical reads and logical reads
Number of rows processed
Misses on the library cache
Username under which each parse occurred
Each mit and rollback
【oracle包怎么跟踪 oracle 10046跟踪指定session】使用
使用前需要注意的地方
初始化参数timed_statistics=true允许sql trace 和其他的一些动态性能视图收集与时间(cpu elapsed)有关的参数 一定要打开 不然相关信息不会被收集 这是一个动态的参数 也可以在session级别设置
SQLalter session set titimed_statistics=true
MAX_DUMP_FILE_SIZE跟踪文件的大小的限制 如果跟踪信息较多可以设置成unlimited 可以是KB MB单位 I开始默认为unlimited这是一个动态的参数 也可以在session级别设置
SQLalter system set max_dump_file_size=
SQLalter system set max_dump_file_size=unlimited
USER_DUMP_DEST指定跟踪文件的路径 默认路径实在$ORACLE_BASE/admin/ORA_SID/udump这是一个动态的参数 也可以在session级别设置
SQLalter system set user_dump_dest=/oracle/trace
数据库级别
设置slq_trace参数为true会对整个实例进行跟踪 包括所有进程 用户进程和后台进程 会造成比较严重的性能问题 生产环境一定要慎用
SQLalter system set sql_trace=true;
Session级别
当前会话
SQLalter session set sql_trace=true;
SQLalter session set sql_trace=false;
其他会话
通过oracle提供的系统包 DBMS_SYSTEM SET_SQL_TRACE_IN_SESSION来实现
SQLexecute dbms_system set_sql_trace_in_session(sid serial# true);
SQLexecute dbms_system set_sql_trace_in_session(sid serial# false);
注
sid serial#从v$session视图中获得
DBMS_SYSTEM包里还可以对其他用户的参数(如 timed_statistics max_dump_file)进行设置 在这不做介绍了 很少用到 想了解dbms_system里的程序包可以desc dbms_system看一下
得到trace文件后我们要用tkprof他进行格式化 通过sql语句快速定位到相应的trace文件
Tkprof
tkprof的目的是将sql trace生成的跟踪文件转换成用户可以理解的格式
格式
tkprof tracefile outputfile [optional | parameters ]
参数和选项(这里只介绍最常用的 也是最实用的)
explain=user/password执行explain命令将结果放在SQL trace的输出文件中
sys=[yes/no]确定系统是否列出由sys用户产生或重调的sql语句
sort=sort_option按照指定的方法对sql trace的输出文件进行降序排序
sort_option选项
prscnt按解析次数排序
prscpu按解析所花cpu时间排序
prsela按解析所经历的时间排序
prsdsk按解析时物理的读操作的次数排序
prsqry按解析时以一致模式读取数据块的次数排序
prscu按解析时以当前读取数据块的次数进行排序
execnt按执行次数排序
execpu按执行时花的cpu时间排序
exeela按执行所经历的时间排序
exedsk按执行时物理读操作的次数排序
exeqry按执行时以一致模式读取数据块的次数排序
execu按执行时以当前模式读取数据块的次数排序
exerow按执行时处理的记录的次数进行排序
exemis按执行时库缓冲区的错误排序
fchcnt按返回数据的次数进行排序
fchcpu按返回数据cpu所花时间排序
fchela按返回数据所经历的时间排序
fchdsk按返回数据时的物理读操作的次数排序
fchqry按返回数据时一致模式读取数据块的次数排序
fchcu按返回数据时当前模式读取数据块的次数排序
fchrow按返回数据时处理的数据数量排序
注
这些排序中我经常用到的是fchdsk fckchela fchqry 因为有问题的sql一般都是大的查询造成的 当然更新 插入 删除时也会存在全表扫描 这就需要:exedsk exeqry exeela等选项 根据具体情况具体分析
Cpu时间和Elapsed时间都是以秒为单位 而且两个值基本上一样 但我比较常用elapsed 他是反映的用户相应时间 从运行sql到用户得到结果的时间 会更实际些
tkprof输出文件各列的含义 (理解下面的含义对我们快速定位问题很有帮助)
parse:
将sql语句转换成执行计划 包括检查是否有正确的授权 需要到得表 列及其他引用到得对象是否存在 这些信息分别存在v$librarycache v$rowcache
execute
oracle实际执行的语句 如 insert update delete 这些会修改数据 对于select操作 这部只是确定选择的行数
fetch
返回查询获得的行数 只有执行select会被收集
Count
这个语句被parse execute fetch的次数的统计
Cpu
这个语句所有的parse execute fetch所用的cpu总的时间 以秒为单位 如果TIMED_STATISTICS 关闭的话 值为
Elapsed
这个语句所有的parse execute fetch所消耗的总的时间 以秒为单位 如果TIMED_STATISTICS 关闭的话 值为
Disk
这个语句所有的parse execute fetch从磁盘上的数据文件中读取的数据块的数量
Query
在一致性读的模式下 这个语句所有的parse execute fetch所获取的buffer数量(这部分是从内存读取的也就是逻辑读取的 相当于执行计划里的consistent gets)
Current
在current模式下 这个语句所有的parse execute fetch所获取的buffer数量 一般是current模式下发生的delect insert update的操作都会获取buffer
Rows
语句返回的行数 不包括子查询中返回的记录数目 对于select语句 返回在fetch这步 对于insert delete update操作 返回记录是在execute这步
分析
我一般的思路步骤是
先找磁盘多的sq l(sort= fchdsk ) 意味着全表扫描 找运行时间长的(sort= fchela) 意味着sql可能写的不好或磁盘 逻辑读较多 找出一致性读较多的(sort= fchqry) 当表不是很大的时候(可能全部缓存住了) 没有发生磁盘读 但不意味着不需要建立索引 或者sql需要优化 找出当前模式从缓冲区获得数据的数量(sort=exedsk exeela exeqry) 这些主要集中在dml语句里的操作 看是否有必要优化sql或建立索引之所以排序是为了在sql很多的时候快速定位sql 如果sql比较少的话就没必要排序了 但我们要有分析问题的思路
举例
我自己建立了一个表
create table t (id int);
begin
for v in loop
insert into t values(v );
end loop
mit;
end;
下面是sql_trace所抓到得sql
不正常状态
*******************************************************************************
select *
from t
where id=
call count cpu elapsed disk query current rows
ParseExecuteFetch
total
Misses in library cache during parse:
Optimizer goal: CHOOSE
Parsing user id: (WH)
Rows Row Source Operation
TABLE ACCESS FULL T
Rows Execution Plan
SELECT STATEMENT GOAL: CHOOSE
TABLE ACCESS (FULL) OF T
首先这是一个select语句 它走了全部扫描
磁盘读( )和逻辑读( )都很多
运行了 次(Execute) 分析了 次(Parse) 一共用了将近 秒(elapsed)
我只是选择表的一行的数据的结果 就发生这么大的成本 很显然是全表扫描的结果造成的
正常状态
在做跟踪前我为这个表建立了一个索引
Create index t on t (id);
*******************************************************************************
select *
from t
where id=
call count cpu elapsed disk query current rows
ParseExecuteFetch
total
Misses in library cache during parse:
Optimizer goal: CHOOSE
Parsing user id: (WH)
Rows Row Source Operation
INDEX RANGE SCAN T (object id )
Rows Execution Plan
SELECT STATEMENT GOAL: CHOOSE
INDEX (RANGE SCAN) OF T (NON UNIQUE)
*******************************************************************************
同样的语句
它走了索引 物理读 这个 其实是开始读索引时需要第一次读入的 以后运行就没有了
逻辑读 (平均这个sql一次 个逻辑读)
同样运行了 次(Execute)
分析了 次(Parse) 运行次数越多 分析次数越少越好一共只用了 秒(elapsed)
lishixinzhi/Article/program/Oracle/201311/17866
如何调试oracle , sqlserver存储过程1.打开PL/SQL Developer如果在机器上安装了PL/SQL Developer的话 , 打开PL/SQL Developer界面输入用户名,密码和host名字 , 这个跟在程序中web.config中配置的完全相同,点击确定找到需要调试的存储过程所在的包(Package bodies),如PACK_ACTIVITY,点击右键,在弹出菜单中选择[查看],得到包中的所有存储过程和他们的代码.2.添加debug信息为了能够单步跟踪存储过程,需要为其所在的包添加debug信息,右键点击需要调试的包 , 在弹出菜单中选中[添加调试信息].这样就为包体添加了调试信息 。3.调试存储过程现在所有的准备工作都做好了 , 可以调试跟踪存储过程了 。选择需要调试的存储过程,点击右键 , 在弹出菜单中选择[测试],进去测试窗口. 测试窗口中有为了测试该存储过程自动所产生的代码,当然你也可以自己另外加入和修改代码,对于我们目前只是为了调试存储过程,自动生成的代码已经足够了 。接着按照如下的步骤进行调试 。(1)添加存储过程所需要的参数,我们项目中的大多数存储过程都是需要参数的,参数可以在测试窗口右下部分输入 。如:GetPanNO_New需要一个输入参数v_employeeid , 我们输入180 , 输出参数是mycursor,是查看结果的,不需要输入任何值 。(2)开始调试,点击[调试]菜单-[开始](或者按F9),就进去调试模式了,程序开始停在begin这一行.(3)以后的调试过程跟我们熟悉的的调试过程就一样了:运行(Ctrl+R)单步进入(Ctrl+N)单步跳过(Ctrl+O)单步退出(Ctrl+T)或者点击debug工具条上的按扭: 当按Ctrl+N进去存储过程的源代码中后在这个窗口中可以查看过程中的变量值和堆栈 。(4)调试运行完了后,可以查看结果如下(点击mycursor变量旁边的按钮).
如何查找ORACLE中的跟踪文件用toad 的工具可以进行跟踪 。查找toad的路径 右键属性 查找相应文件夹 然后 找寻同级目录下的 sql_monitor 这个工具就可以对 Oracle运行数据进行跟踪 。
如何利用JDBC启动Oracle 自动追踪1.下载Debug版本jar包
首先要下载一个Debug版本的JDBC jar包 , Debug版本的jar包命名形式为jdbcX_g.jar
2.启动Logging模式
第一种方式:设置运行环境变量 java -Doracle.jdbc.Trace=true ...(elipse中run-run configurations-arguments一栏)
第二种方式:在程序中控制(建议采用这种方式)
1
2
3
4
5
6
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
String loader = Thread.currentThread().getContextClassLoader().toString().replaceAll("[,=:\"] ", "");
ObjectName pattern = new ObjectName("com.a href="https://www.04ip.com/post/;tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"oracle/a.jdbc:type=diagnosability,name="loader);
ObjectName diag = ((ObjectName[]) (mbs.queryNames(pattern, null).toArray(new ObjectName[0])))[0];
mbs.setAttribute(diag, new Attribute("LoggingEnabled", true));
System.out.println("LoggingEnabled = "mbs.getAttribute(diag, "LoggingEnabled"));
如果用的是Oracle 10g,直接执行:
1
2
3
/**oracle 10g 启动方法*/
oracle.jdbc.driver.OracleLog.setTrace(true); // enable logging
oracle.jdbc.driver.OracleLog.setTrace(false); // disable logging
3.配置log文件
jdbc使用的是 java.util.logging包中的Logger对象打印log 。
1
2
3
4
5
6
/**配置a href="https://www.04ip.com/post/;tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"log文件/a*/
Handler fh = new FileHandler("./oracle_jdbc_log.log");
fh.setLevel(Level.ALL);
fh.setFormatter(new SimpleFormatter());
Logger.getLogger("").addHandler(fh);
Logger.getLogger("").setLevel(Level.ALL);
完成的Demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
public void run() throws SQLException {
DriverManager.registerDriver(new OracleDriver());
//需在加载OracleDriver之后开启log
enableOracleLogging();
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
conn = getConnection();
System.out.println("Connection retrieved..");
stmt = conn.createStatement();
rset = stmt.executeQuery("select empno from emp");
while (rset.next()) {
System.out.println(rset.getInt(1));
}
} catch (SQLException sqle) {
sqle.printStackTrace();
} finally {
if (rset != null) {
rset.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
public static void enableOracleLogging() {
try {
/** 配置a href="https://www.04ip.com/post/;tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"log文件/a */
Handler fh = new FileHandler("./oracle_jdbc_log.log");
fh.setLevel(Level.ALL);
fh.setFormatter(new SimpleFormatter());
Logger.getLogger("").addHandler(fh);
Logger.getLogger("").setLevel(Level.ALL);
/** oracle a href="https://www.04ip.com/post/;tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"11g/a 启动方法 */
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
String loader = Thread.currentThread().getContextClassLoader().toString().replaceAll("[,=:\"] ", "");
ObjectName pattern = new ObjectName("com.oracle.jdbc:type=diagnosability,name="loader);
ObjectName diag = ((ObjectName[]) (mbs.queryNames(pattern, null).toArray(new ObjectName[0])))[0];
mbs.setAttribute(diag, new Attribute("LoggingEnabled", true));
System.out.println("LoggingEnabled = "mbs.getAttribute(diag, "LoggingEnabled"));
/** oracle 10g 启动方法 */
// oracle.jdbc.driver.OracleLog.setTrace(true); // enable logging
// oracle.jdbc.driver.OracleLog.setTrace(false); // disable logging
} catch (Exception e) {
e.printStackTrace();
}
}
oracle包怎么跟踪的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于oracle 10046跟踪指定session、oracle包怎么跟踪的信息别忘了在本站进行查找喔 。
推荐阅读
- 现在用什么软件做淘宝直播,淘宝直播用什么软件好
- 头条号如何推广抖音号赚钱,抖音头条怎么推广
- amd7670m显卡怎么样,amd7670显卡4g参数
- js的作用描述错误,描述了javascript的基本语法
- oracle自连接如何写 oracle自然连接怎么用
- flutter水平垂直嵌套滑动,flutter scrollview嵌套listview
- 经营汉堡炸鸡游戏,经营汉堡炸鸡游戏怎么玩
- 公众号写的文章怎么保存,公众号里的文章怎么保存
- oracle如何拼接两个 oracle怎么合并两条数据