DBMS_PROFILER
功能描述
DBMS_PROFILER提供了一个接口,用于分析现有的PL/pgSQL应用程序并确定性能瓶颈。该内置包可以收集性能分析数据,用来提高性能或确定PL/pgSQL应用程序的代码覆盖率。
应用程序开发人员可以使用代码覆盖率数据来集中精力进行增量测试。使用该内置包的接口,可以为在会话中执行的所有命名库单元(package body、function、procedure、trigger、anonymous block)生成分析信息。该信息包括执行每行的总次数、执行该行所花费的总时间以及该行的特定执行所花费的最短和最长时间。分析信息存储在数据库表中,可查询数据、构建自定义报告(摘要报告、最热的行、代码覆盖率数据等)以及分析数据。该内置包包含以下函数:
注意事项
可以通过profiler.sql工具产生HTML格式的性能报表,具体使用方法见示例。
使用DBMS_PROFILER内置包前,需要先加载安装目录/share/postgresql目录下的proload.sql文件。该步骤需要在目标库内部执行,加载命令如下(安装路径请以实际情况为准):
\i ./local/vastbase/share/postgresql/proload.sql;
如果该命令执行报错,可以找到preload.sql文件手动执行preload.sql文件中命令创建收集器。收集器相关表说明如下:
收集器相关表名 描述 plsql_profiler_runs 记录运行中的收集器信息。 plsql_profiler_units 有关运行中每个库单元的信息。 plsql_profiler_data 收集器收集的详细数据。 plsql_profiler_runnumber序列 生成唯一运行编号。
子程序
START_PROFILER
功能描述
在用户会话中启动事件探查器数据收集。启动一次数据收集就要START_PROFILER,中间可以暂停、继续、刷新数据。如果一直不STOP_PROFILER,收集器就一直在收集 plpgsql执行的性能数据;如果不执行START_PROFILER就执行STOP_PROFILER、 暂停、继续、刷新数据也不会出错,但没有实际数据收集。
语法格式
DBMS_PROFILER.START_PROFILER() RETURN bigint;
DBMS_PROFILER.START_PROFILER(run_comment varchar) RETURN bigint;
DBMS_PROFILER.START_PROFILER(run_comment varchar,run_comment1 varchar) RETURN bigint;
参数说明
run_comment
此次收集器的说明或注释。
run_comment1
此次收集器的附加说明。
返回值
返回此次收集器的运行ID(RUNID)。
STOP_PROFILER
功能描述
停止用户会话中的探查器数据收集。此功能将会刷新会话中已收集的数据。
语法格式
DBMS_PROFILER.STOP_PROFILER () RETURN bigint;
PAUSE_PROFILER
功能描述
暂停用户会话中的探查器数据收集。
语法格式
DBMS_PROFILER.PAUSE_PROFILER() RETURN bigint;
RESUME_PROFILER
功能描述
恢复暂停状态中的探查器数据收集。
语法格式
DBMS_PROFILER.RESUME_PROFILER () RETURN bigint;
FLUSH_DATA
功能描述
刷新在用户会话中收集的探查器数据。
语法格式
DBMS_PROFILER.FLUSH_DATA() RETURN bigint;
ROLLUP_UNIT
功能描述
计算对应runid和unit所花费的时间,并将总花费的时间刷新到PLSQL_PROFILER_UNITS表中的total_time字段中。
语法格式
DBMS_PROFILER.ROLLUP_UNIT (run_number bigint,unit integer) RETURN void;
参数说明
run_number
输入收集器的RUNID。
unit
输入收集单元的UNITID。
ROLLUP_RUN
功能描述
统计指定runid收集器下所有unit所花费的时间,并将花费时间刷新到 PLSQL_PROFILER_UNITS表中的total_time字段中。
DBMS_PROFILER.ROLLUP_RUN (run_number bigint) RETURN void;
参数说明
run_number
输入收集器的RUNID。
示例
前置条件:在目标库中执行如下语句加载proload.sql文件。
\i ./local/vastbase/share/postgresql/proload.sql;
1、创建测试表。
create table tab_test(col int);
2、创建要统计PL/pgSQL性能的存储过程sp_test。
create or replace procedure sp_test
as
begin
for i in 1..100
loop
insert into tab_test values(1);
end loop;
end;
/
3、创建要统计PL/pgSQL性能的存储过程sp_test2。
create or replace procedure sp_test2
as
begin
for i in 1..10000
loop
insert into tab_test values(i);
end loop;
end;
/
4、统计sp_test的执行性能。
select dbms_profiler.start_profiler('sp');
返回如下信息:
stop_profiler
---------------
1
(1 row)
5、调用存储过程sp_test,sp_test2。
call sp_test();
select dbms_profiler.flush_data();
select dbms_profiler.pause_profiler();
call sp_test2();
select dbms_profiler.resume_profiler();
select dbms_profiler.stop_profiler();
select dbms_profiler.rollup_unit(1,1);
select dbms_profiler.rollup_run(1);
6、收集性能分析数据:
样例1:
select * from plsql_profiler_runs;
返回结果为:
runid | related_run | run_owner | run_date | run_comment | run_total_time | run_system_info | run_comment1 | spare1 -------+-------------+-----------+----------------------------+-------------+----------------+-----------------+--------------+-------- 1 | 0 | vastbase | 2023-07-16 07:57:12.004044 | sp | 5966 | | | (1 row)
样例2:
select * from plsql_profiler_units;
返回结果如下:
runid | unit_number | unit_type | unit_owner | unit_name | unit_timestamp | total_time | spare1 | spare2 -------+-------------+-----------+------------+-----------+----------------------------+------------+--------+-------- 1 | 1 | PROCEDURE | vastbase | sp_test | 2023-07-16 07:58:11.668797 | 2983 | | (1 row)
样例3:
select * from plsql_profiler_data;
返回结果如下:
runid | unit_number | line# | total_occur | total_time | min_time | max_time | spare1 | spare2 | spare3 | spare4 -------+-------------+-------+-------------+------------+----------+----------+--------+--------+--------+-------- 1 | 1 | 4 | 1 | 1562 | 1562 | 1562 | | | | 1 | 1 | 6 | 100 | 1421 | 7 | 51 | | | | (2 rows)