使用dbms_profiler收集存储过程每步执行时间
最近和优化团队的专家学到一个很有意义的内置包:dbms_profiler,专门用于分析Oracle存储过程中的各段代码的时间开销情况,从而快速找到性能瓶颈的步骤。
- 1.sys创建dbms_profiler
- 2.创建profiler用户,对应表和序列,赋权
- 3.sys为表和序列创建public同义词
- 4.使用dbms_profiler收集执行时间信息
- 5.查询并分析结果
1.sys创建dbms_profiler
conn /as sysdba
desc dbms_profiler --先确认dbms_profiler包是否存在,如果不存在则通过下面的方式创建
@?/rdbms/admin/profload.sql
注:文件在%ORACLE_HOME%\RDBMS\ADMIN\profload.sql
主要函数:
start_profiler 启动对该程式监控
stop_profiler 结束对该程式监控
2.创建profiler用户,对应表和序列,赋权
conn / as sysdba;
CREATE USER profiler IDENTIFIED BY profiler;
grant connect,resource to profiler;
conn profiler/profiler;
@?/rdbms/admin/proftab.sql
GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_data TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_units TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_runs TO PUBLIC;
备注:
plsql_profiler_runs --prof运行信息
plsql_profiler_units --prof每个单元信息
plsql_profiler_data --prof每个单元的详细数据
plsql_profiler_runnumber --用来生成prof唯一运行编号的序列
3.sys为表和序列创建public同义词
conn /as sysdba;
CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;
CREATE PUBLIC SYNONYM plsql_profiler_runs FOR profiler.plsql_profiler_runs;
CREATE PUBLIC SYNONYM plsql_profiler_units FOR profiler.plsql_profiler_units;
CREATE PUBLIC SYNONYM plsql_profiler_data FOR profiler.plsql_profiler_data;
4.使用dbms_profiler收集执行时间信息
假设我们要对下面这样的一个存储过程进行分析:
CREATE OR REPLACE procedure sp_profiler_test1
as
begin
for x in 1..10000
loop
insert into t_t1 values(x);
end loop;
commit;
end sp_profiler_test1;
/
收集该存储过程执行时间信息的方法如下:
set serverout on;
DECLARE
v_run_number integer;
v_temp1 integer;
BEGIN
--启动profiler
sys.DBMS_PROFILER.start_profiler (run_number => v_run_number);
--显示当前跟踪的运行序号(后面查询要用)
DBMS_OUTPUT.put_line ('run_number:' || v_run_number);
--运行要跟踪的PLSQL
sp_profiler_test1; --前一步创建的测试样例存储过程
--停止profiler
sys.DBMS_PROFILER.stop_profiler;
END;
5.查询并分析结果
set linesize 1000
col text format a60
SELECT d.line#, --代码行号
s.text, --源代码
d.total_time, --总共运行时间(单位10亿分之一秒,即10的-9次方。)
d.total_occur, --总共运行次数
d.min_time, --最小运行时间
d.max_time --最大运行时间
FROM plsql_profiler_data d, sys.all_source s, plsql_profiler_units u
WHERE d.runid = 2 --运行号(上一步执行相关过程时显示号码)
and u.unit_name = 'SP_PROFILER_TEST1' --单元名,即被测试的存储过程名
AND u.runid = d.runid
AND d.unit_number = u.unit_number
AND d.total_occur <> 0
AND s.TYPE(+) = u.unit_type
AND s.owner(+) = u.unit_owner
AND s.name(+) = u.unit_name
AND d.line# = NVL (s.line, d.line#)
ORDER BY d.total_time desc, u.unit_number, d.line#;
示例查询结果如下:
LINE# TEXT TOTAL_TIME TOTAL_OCCUR MIN_TIME MAX_TIME
---------- -------------------------------------- ---------- ----------- ---------- ----------
6 insert into t_t1 values(x); 150147563 10000 13108 3831882
4 for x in 1..10000 613220 10001 26 7514
8 commit; 75630 1 75630 75630
9 end sp_profiler_test1; 1683 1 1683 1683
Elapsed: 00:00:01.39
说明:LINE#代表对应TEXT的语句在存储过程的第几行,TOTAL_TIME代表执行的总时间(单位ns,10的负9次方秒),TOTAL_OCCUR代表执行的次数,MIN_TIME代表最短单次的运行时间,MAX_TIME代表最长单次的运行时间。
上面这个例子就是存储过程SP_PROFILER_TEST1中的第6行代码insert into t_t1 values(x);消耗时间占比最大,这一步总消耗150ms,执行了10000次,单次执行最短是13108ns,最长是3.83ms。
使用dbms_profiler收集存储过程每步执行时间的更多相关文章
- mysql分页存储过程一步一步实现
1. CREATE DEFINER=`root`@`localhost` PROCEDURE `P_HoverTreePages`( ), ) , ), ), ), IN `SortType` INT ...
- 使用sys.dm_exec_cached_plans监控存储过程性能
讨论了如何使用sys.dm_exec_query_stats动态管理视图(dmv ).本文将以SQL Server 2005为例,讨论如何利用dmv信息来判断tsql的性能优劣.在这篇文章中将继续我有 ...
- SQL2005解密已经被加密的存储过程
SQL2005解密已经被加密的存储过程 第一步:打开DAC连接功能 第二步:在MASTER数据库创建一个解密存储过程 USE master GO CREATE PROCEDURE [dbo].[sp_ ...
- Dapper学习笔记(5)-存储过程
一.无参存储过程 第一步:创建一个不带参数的存储过程,代码如下: CREATE PROCEDURE [dbo].[QueryRoleNoParms] AS BEGIN SELECT * FROM T_ ...
- oracle10g 统计信息查看、收集
1. 统计信息查看 1.1 单个表的全局统计信息.统计效果查看 2. 统计信息分析(收集) 2.1 分析工具选择 2.2 分析前做index重建 2.3 分析某数据表,可以在PL/SQL的comm ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- python web自动化测试框架搭建(功能&接口)——测试用例执行和结果收集
由于unittest框架中结果收集在不同文件中,所以此处重写结果收集方法,加入执行时间,失败信息,失败截图等 TestRunner.py # coding=utf-8 import sys impor ...
- delete大批量数据引起空间爆满处理
前一天晚上做大表删除操作测试,分段删除,没删除100000条commit一次,由于存储过程打印了执行时间中途断网,无法看到执行时间于是直接kill了任务结果早上登录测试数据库发现空间爆满然后一时糊涂去 ...
- 使用 HAProxy, PHP, Redis 和 MySQL 轻松构建每周上亿请求Web站点
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
随机推荐
- nginx+apache动静分离/负载均衡
[主从] [Mysql-Master] log-bin=mysql-bin server-id = MariaDB [(none)]> grant replication slave on *. ...
- 【Linux】-- Linux上java运行环境的配置(JDK+TOMCAT)
1.JDK安装 安装之前首先要查询软件是否存可以直接使用yum安装 yum search java | grep open 选择需要的版本安装 注意:*星号代表下载该版本的所有文件,不能少. 验证是否 ...
- GCD Counting-树形DP
GCD Counting 思路: 预处理 每个权值的素因子.问题转化为 以同一个素数作为因子 最长的链, 树形DP求解,ans 由 此点的 最长子链 + 次长子链 相加得到, 然后再更新最长子链 ...
- 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz
原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...
- 2019-2-20Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构
varchar 和 nvarchar区别: varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字 ...
- pymongo使用手册
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习5
#include <iostream>using namespace std;const MAXSIZE=12;const year=3;int main(){ char *month[M ...
- 清除电脑缓存的bat文件
电脑在使用了之后,会产生垃圾缓存,若不及时清理会降低电脑的运行速度. 1.步骤: 2.新建一个记事本文件,命名“系统清理”;(或其他名字) 3.原封不动复制下面的文字到该记事本中 @echo off ...
- 菜鸟详细解析Cookie注入原理
一.SQL注入原理 我以aspx为例,现在我们来研究下Cookie注入是怎么产生的,在获取URL参数的时候,如果在代码中写成Request[“id”],这样的写法问题就出现了.我先普及下科普知识,在a ...
- jenkins测试配置