Oracle性能分析工具

Oracle性能分析工具

PL/SQL跟踪

PL/SQL Hierarchical Profiler (HPROF)

HPROF实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- 0. 在ftp上创建目录,或首先确保目录存在

-- 1. 创建目录定义
CREATE OR REPLACE DIRECTORY PLSHPROF_DIR as '/home/oratest';
-- 注意:如果没有权限,可能需要授权
GRANT READ, WRITE ON DIRECTORY PLSHPROF_DIR TO APPS;

BEGIN
DBMS_HPROF.START_PROFILING('PLSHPROF_DIR', 'gjhprof_test_210121.trc');
END;

DECLARE
l_return_status VARCHAR2(1);
l_msg_data VARCHAR2(4000);
BEGIN
gj_congl_voucher_sync_test.main(errbuf => l_return_status,
retcode => l_msg_data);
END;

BEGIN
-- Stop profiling
DBMS_HPROF.STOP_PROFILING;
END;

文件输出:

image.png

从PLHPROF中生成的是plsql虚拟机源代码,难以读懂,一般会再次使用分析器转化成易读的数据。

以下为PLHPROF生成的部分源代码

image.png

使用分析器

两种方式

  • 第一种:hprof格式化命令
  • 第二张:使用dbmshptab.sql

hprof格式化

命令

1
plshprof -output gjhprof_test_210121 gjhprof_test_210121.trc

输出结果

image.png

分析报表

image.png

总结

  1. 定义跟踪文件目录并授权
  2. 开启PLSQL程序跟踪
  3. 格式化报告

SQL跟踪

ORACLE SQL TRACE (10046)

跟踪文件所在位置

方法1:登陆到数据库服务器上,查找日志文件 alert_PROD.log 的目录,即为trace文件所在目录

方法2:通过命令 show parameter user_dump_dest; 可以看到日志文件所在位置。不适用于修改过路径的情况。

一般路径名

/u01/test/db/12.1.0/admin/TEST_erp1/diag/rdbms/test/TEST/trace

一般格式

$ORACLE_HOME/admin/TEST_erp1/diag/rdbms/test/TEST/trace

方法3:查看当前session生成的trace文件名,然后到数据库服务器中搜索

1
2
3
4
5
6
// 查找trace文件名
SELECT c.value || '/' || d.instance_name || '_ora_' || a.spid || '.trc' trace
FROM v$process a, v$session b, v$parameter c, v$instance d
WHERE a.addr = b.paddr
AND b.audsid = userenv('sessionid')
AND c.name = 'user_dump_dest';

结果:后缀名为所求,路径部分不一定准确

image.png

方法4:对plsql进行跟踪

sid和serial可以从v$session中获取

1
exec dbms_system.set_sql_trace_in_session(sid,serial#,true);

image.png

执行完毕存储过程后

1
exec dbms_system.set_sql_trace_in_session(sid,serial#,false);

启用跟踪

【注意】这里仅修改当前会话设置

开启跟踪

1
2
alter session set sql_trace = true;
alter session set timed_statistics = true; //同步打开计时信息(可选)

然后执行sql语句

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
SELECT gd.iface_id,
gd.source_txn_id,
gd.po_header_id,
gd.po_line_id,
pll.line_location_id,
pll.receiving_routing_id,
pda.po_distribution_id,
gd.vendor_id,
gd.vendor_site_id,
gd.shipment_header_id,
gd.shipment_line_id,
gd.organization_id,
gd.quantity,
gd.item_id,
gd.lot_number,
gd.subinventory_code,
gd.locator_id,
gd.process_date,
pha.org_id,
gd.created_by
FROM gj_bc_po_deliver_iface gd,
po_headers_all pha,
po_lines_all pla,
po_line_locations_all pll,
po_distributions_all pda
WHERE gd.po_header_id = pha.po_header_id
AND pha.po_header_id = pla.po_header_id
AND pla.po_line_id = pll.po_line_id
AND gd.po_line_id = pla.po_line_id
AND gd.po_line_location_id = pll.line_location_id
AND pll.line_location_id = pda.line_location_id
ORDER BY gd.po_header_id;

关闭sql跟踪

1
alter session set sql_trace = false;

格式化跟踪文件

使用cp命令复制到根目录

1
cp /u01/test/db/12.1.0/admin/TEST_erp1/diag/rdbms/test/TEST/trace/TEST_ora_31641.trc /home/oratest

格式化跟踪文件

使用tkprof命令,如果要查看执行计划,需要提供可以连接到数据库的账号密码

1
tkprof TEST_ora_31641.trc TEST_ora_31641.txt explain=apps/apps aggregate=yes sys=no waits=yes sort=fchela

0%