首页 > 数据库 >Oracle利用 DBMS_PROFILER 包来分析PL/SQL瓶颈

Oracle利用 DBMS_PROFILER 包来分析PL/SQL瓶颈

时间:2023-09-07 11:23:05浏览次数:78  
标签:10 DBMS 包来 PROFILER TIME LINE profiler

 

Oracle利用 DBMS_PROFILER 包来分析PL/SQL瓶颈

 

在 Oracle 10g 版本之前,默认情况下不会安装 DBMS_PROFILER 包,此次演示版本为11.2.0.4.0,默认已经安装。

安装 DBMS_PROFILER 包方式如下:

sqlplus / as sysdba
desc dbms_profiler    --不存在则通过下面的方式创建
@?/rdbms/admin/profload.sql

 

另外,DBMS_PROFILER 包收集的分析信息存储在多个表中,而这些表默认情况下不会创建,需要在使用 DBMS_PROFIER 包之前在所有数据库版本中显式创建。

方法是运行位于 $ORACLE_HOME/rdbms/admin 文件夹中的脚本“proftab.sql”。这些表可以在普通用户或 SYS 用户中创建,如果在 SYS 中创建,则需要向想要使用 DBMS_PROFILER 包的用户授予适当的权限。

运行“proftab.sql”创建以下对象:

  1. PLSQL_PROFILER_RUNS  - PL/SQL 探查器的运行特定信息。
  2. PLSQL_PROFILER_UNITS - 有关运行中每个库单元的信息。
  3. PLSQL_PROFILER_DATA  - 所有分析器运行的累积数据。
  4. 序列 PLSQL_PROFILER_RUNNUMBER

这里使用 SYS 用户创建并授权:

sqlplus / as sysdba
@?/rdbms/admin/proftab.sql

GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON sys.plsql_profiler_data  TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON sys.plsql_profiler_units TO PUBLIC;
GRANT SELECT,INSERT,UPDATE,DELETE ON sys.plsql_profiler_runs  TO PUBLIC;

CREATE PUBLIC SYNONYM sys.plsql_profiler_runnumber FOR plsql_profiler_runnumber;
CREATE PUBLIC SYNONYM sys.plsql_profiler_runs      FOR plsql_profiler_runs;
CREATE PUBLIC SYNONYM sys.plsql_profiler_units     FOR plsql_profiler_units;
CREATE PUBLIC SYNONYM sys.plsql_profiler_data      FOR plsql_profiler_data;

 

https://www.cnblogs.com/PiscesCanon/p/17684336.html

 

这样所有的普通用户都有权限操作以上涉及的4个对象。

 

接下来使用普通用户ZKM进行测试,创建测试表和存储过程如下:

CREATE TABLE zkm (id int);

CREATE OR REPLACE procedure proc_insert_zkm
as
begin
   for x in 1..10000
   loop
       insert into zkm values(x);
       commit;
   end loop;
end proc_insert_zkm;
/

 

开始测试:

1.
SET SERVEROUTPUT ON
DECLARE
  v_run_id    PLS_INTEGER;
  v_ret_value PLS_INTEGER;
BEGIN
  v_ret_value := DBMS_PROFILER.START_PROFILER('TEST PROFILER','SAMPLE PROFILER',v_run_id);
  DBMS_OUTPUT.PUT_LINE ('The run_number is : ' || v_run_id);
EXCEPTION WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE('Error while starting the profiler :' || SQLERRM);
END;
/

2.
EXEC proc_insert_zkm;     --你需要调试的SQL、存储过程,匿名块等

3.
BEGIN
  DBMS_PROFILER.STOP_PROFILER;
EXCEPTION WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE('Error while stopping the profiler :' || SQLERRM);
END;
/
方便复制

 

同个会话执行:

---step 1
10:54:50 ZKM@zkmdb(26)> SET SERVEROUTPUT ON
10:54:57 ZKM@zkmdb(26)> DECLARE
10:54:57   2    v_run_id    PLS_INTEGER;
10:54:57   3    v_ret_value PLS_INTEGER;
10:54:57   4  BEGIN
10:54:57   5    v_ret_value := DBMS_PROFILER.START_PROFILER('TEST PROFILER','SAMPLE PROFILER',v_run_id);
10:54:57   6    DBMS_OUTPUT.PUT_LINE ('The run_number is : ' || v_run_id);
10:54:57   7  EXCEPTION WHEN OTHERS THEN
10:54:57   8    DBMS_OUTPUT.PUT_LINE('Error while starting the profiler :' || SQLERRM);
10:54:57   9  END;
10:54:57  10  /
The run_number is : 4

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00

---step 2
10:55:00 ZKM@zkmdb(26)> EXEC proc_insert_zkm;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.96

---step 3
10:55:11 ZKM@zkmdb(26)> BEGIN
10:55:14   2    DBMS_PROFILER.STOP_PROFILER;
10:55:14   3  EXCEPTION WHEN OTHERS THEN
10:55:14   4    DBMS_OUTPUT.PUT_LINE('Error while stopping the profiler :' || SQLERRM);
10:55:14   5  END;
10:55:14   6  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01

 

 可以查询视图PLSQL_PROFILER_RUNS来查看执行过的DBMS_PROFILER来调试的信息:

10:59:53 SYS@zkmdb(503)> COL RUN_COMMENT FOR A25
11:00:08 SYS@zkmdb(503)> SELECT RUNID, RUN_DATE, RUN_COMMENT FROM PLSQL_PROFILER_RUNS;

     RUNID RUN_DATE            RUN_COMMENT
---------- ------------------- -------------------------
         1 2023-09-07 10:37:38 TEST PROFILER
         2 2023-09-07 10:38:15 TEST PROFILER
         3 2023-09-07 10:46:52 TEST PROFILER
         4 2023-09-07 10:47:59 TEST PROFILER
         5 2023-09-07 10:54:20 TEST PROFILER

Elapsed: 00:00:00.00

 

 通过上边step 1步骤获得的run_number为4,结合一下脚本可以查询到我们需要的信息:

COLUMN UNIT_NAME FORMAT A35
COLUMN OCCURRED  FORMAT 999999
COLUMN LINE      FORMAT 9999
COLUMN TOT_TIME  FORMAT 999.999999
COLUMN TEXT      FORMAT A46
SELECT P.UNIT_NAME, P.OCCURRED, P.TOT_TIME, P.MIN_TIME, P.MAX_TIME, P.LINE# LINE, SUBSTR(S.TEXT, 1,75) TEXT
FROM (SELECT U.UNIT_NAME, D.TOTAL_OCCUR OCCURRED, (D.TOTAL_TIME/1E9) TOT_TIME, D.MIN_TIME/1E9 MIN_TIME, D.MAX_TIME/1E9 MAX_TIME,
D.LINE# FROM PLSQL_PROFILER_UNITS U, PLSQL_PROFILER_DATA D
WHERE D.RUNID=U.RUNID AND D.UNIT_NUMBER = U.UNIT_NUMBER AND D.TOTAL_OCCUR >0
AND U.RUNID= 4) P,USER_SOURCE S
WHERE P.UNIT_NAME = S.NAME(+) AND P.LINE# = S.LINE (+)
ORDER BY P.LINE#;
方便复制

 

10:59:27 ZKM@zkmdb(26)> COLUMN UNIT_NAME FORMAT A35
11:03:00 ZKM@zkmdb(26)> COLUMN OCCURRED  FORMAT 999999
11:03:00 ZKM@zkmdb(26)> COLUMN LINE      FORMAT 9999
11:03:00 ZKM@zkmdb(26)> COLUMN TOT_TIME  FORMAT 999.999999
11:03:00 ZKM@zkmdb(26)> COLUMN TEXT      FORMAT A46
11:03:01 ZKM@zkmdb(26)> SELECT P.UNIT_NAME, P.OCCURRED, P.TOT_TIME, P.MIN_TIME, P.MAX_TIME, P.LINE# LINE, SUBSTR(S.TEXT, 1,75) TEXT
11:03:01   2  FROM (SELECT U.UNIT_NAME, D.TOTAL_OCCUR OCCURRED, (D.TOTAL_TIME/1E9) TOT_TIME, D.MIN_TIME/1E9 MIN_TIME, D.MAX_TIME/1E9 MAX_TIME,
11:03:01   3  D.LINE# FROM PLSQL_PROFILER_UNITS U, PLSQL_PROFILER_DATA D
11:03:01   4  WHERE D.RUNID=U.RUNID AND D.UNIT_NUMBER = U.UNIT_NUMBER AND D.TOTAL_OCCUR >0
11:03:01   5  AND U.RUNID= 4) P,USER_SOURCE S
11:03:01   6  WHERE P.UNIT_NAME = S.NAME(+) AND P.LINE# = S.LINE (+)
11:03:01   7  ORDER BY P.LINE#;

UNIT_NAME                           OCCURRED    TOT_TIME   MIN_TIME   MAX_TIME  LINE TEXT
----------------------------------- -------- ----------- ---------- ---------- ----- ----------------------------------------------
<anonymous>                                3     .000028    .000001    .000024     1
<anonymous>                                2     .000086    .000003    .000038     1
<anonymous>                                2     .000116    .000004     .00004     1
<anonymous>                                2     .000065          0    .000063     1
<anonymous>                                2     .000094    .000004    .000041     1
<anonymous>                                1     .000004    .000004    .000004     1
<anonymous>                                2     .000063    .000001    .000062     2
PROC_INSERT_ZKM                        10001     .001925          0    .000016     4    for x in 1..10000
<anonymous>                                1     .000037    .000037    .000037     5
<anonymous>                                1     .000043    .000043    .000043     6
<anonymous>                                1     .000041    .000041    .000041     6
PROC_INSERT_ZKM                        10000     .571903    .000049 .001052005     6        insert into zkm values(x);
PROC_INSERT_ZKM                        10000     .383340    .000033 .000887004     7       commit;
PROC_INSERT_ZKM                            1     .000002    .000002    .000002     9 end proc_insert_zkm;
<anonymous>                                1     .000001    .000001    .000001     9
<anonymous>                                1     .000001    .000001    .000001    11

16 rows selected.

Elapsed: 00:00:00.06

 

OCCURRED:当前line被执行的次数

TOT_TIME:执行line总共消耗时间,单位s

MIN_TIME:该line在执行了occurred次中某一次的最短时间,单位s

MAX_TIME:该line在执行了occurred次中某一次的最长时间,单位s

PS:可自行修改脚本调整时间单位,PLSQL_PROFILER_DATA.MAX_TIME单位是纳秒。

 

参考:

https://cloud.tencent.com/developer/article/1431556?from=15425

Using DBMS_PROFILER (文档 ID 97270.1)

防偷防爬:https://www.cnblogs.com/PiscesCanon/p/17684336.html

https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_PROFILER.html

 

标签:10,DBMS,包来,PROFILER,TIME,LINE,profiler
From: https://www.cnblogs.com/PiscesCanon/p/17684336.html

相关文章

  • 巨杉数据库再度入选Gartner《Market Guide for DBMS, China》
    巨杉数据库凭借卓越的分布式文档型数据库技术与创新实力,连续第二年被列为中国数据库管理系统的代表厂商,标志着其在国内分布式数据库行业的领先地位。近日,Gartner公布了《MarketGuideforDBMS,China》报告,巨杉数据库凭借卓越的分布式文档型数据库技术与创新实力,再次脱颖而出,连......
  • MegEngine 使用小技巧:Profiler使用手册
    0.写在前面“xx,R那边反应多机训练速度慢,你看一下什么情况”“xxx,为什么MGE更新之后,xxx网络训练变慢了,你看一下”这是组内日常对话然后有人日常背锅组员的状态是:提性能,提性能,还是TMD提性能据不完全统计,有80%的性能问题其实是因为训练代码写的不够好,让MGE有力使不出......
  • 一个被低估的插件:IDEA+JProfiler=性能分析神器
    JProfiler17.1.3(IDEA插件)JProfiler9.2(可执行软件)IntelliJIDEA2017.2.5下载下载JProfiler(IDEA)插件方式1:在IDEA上直接下载Settings–plugins–Browserepositories 搜索JProfiler点击install按钮安装,然后从启IDEA工具 看到如下图片则说明安装完成 方式2:......
  • 使用JProfiler分析程序性能问题
    JProfiler是一个分析运行时JVM的专业工具,根据官网的介绍,应用主要有以下几个功能:方法调用:通常被称为"CPU分析"。方法调用可以通过不同的方式进行测量和可视化,分析方法调用可以帮助了解你的应用程序正在做什么,并找到提高其性能的方法。分配:分析堆上对象的分配、引用链和垃圾......
  • 亚信科技AntDB数据库连年入选《中国DBMS市场指南》代表厂商
    近日,全球权威ICT研究与顾问咨询公司Gartner发布了2023年《MarketGuideforDBMS,China》(即“中国DBMS市场指南”),该指南从市场份额、技术创新、研发投入等维度对DBMS供应商进行了调研。亚信科技是领先的数智化全栈能力提供商,作为国内最早一批投入数据库研发的企业,其自研的AISWare......
  • PLSQL:DBMS_XMLPARSER包
    使用==DBMS_XMLPARSER==,你可以访问XML文档的内容和结构。它描述了处理XML文件的计算机程序的行为。在结构上看,XML文档和SGML文档是一样的。XML文档是由称为==实体==的存储单元组成的,实体中包含解析的和未被解析的数据。解析后的数据由字符串组成,其中一些代表字符数据,一些代表标记......
  • RDBMS与Hbase对比 HDFS与HBase对比 Hive与HBase对比
    RDBMS:HBASE:HDFS与HBase对比:Hive与HBase对比: Hive与HBase总结......
  • Oracle DBMS_JOB包的使用
    DBMS_JOB包介绍DBMS_JOB程序包主要是调度和管理作业队列中的作业。换句话说,其实就是用来管理定时任务的程序包。Oracle推荐使用DBMS_SCHEDULER包来替代DBMS_JOB包。DBMS_JOB包中的存储过程使用DBMS_JOB程序包中主要有以下存储过程:BROKENCHANGEINSTANCEINTERVALNEXT_DATEREMOVERUNSU......
  • 英特尔® VTune™ Profiler 用户指南——程序性能异常检测分析
    https://www.intel.com/content/www/us/en/develop/documentation/vtune-help/top/analyze-performance/algorithm-group/anomaly-detection-analysis.html 异常检测分析(预览) 使用异常检测来识别频繁重复的代码间隔(如循环迭代)中的性能异常。在微秒和纳秒级别执行细粒度分析。应用......
  • JProfiler的安装与使用
    JProfiler的安装与使用JProfiler是由ej-technologiesGmbH公司开发的一个用于分析JVM内部情况的专业工具。在研发过程中可以使用JProfiler,用于质量保证,也可以用于解决生产系统遇到的问题。JProfiler处理的主要问题Methodcalls(方法调用)通常被称为"CPU分析"。方法调用可以......