基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
DBMS_PROFILER 概述
更新时间:2026-07-15 20:42:46
DBMS_PROFILER 系统包用来记录 PL 中每一行的执行情况,并将结果汇总起来,详细展示 PL 执行过程中每一条语句的执行时间。
功能适用性
该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。
DBMS_PROFILER 权限说明
该系统包权限为 AUTHID CURRENT_USER。
子程序概览
下表列出了 OceanBase 数据库当前版本所支持的 DBMS_PROFILER 子程序和简要描述。
| 子程序 | 描述 |
|---|---|
| start_profiler | 启动性能剖析器,启动后会记录当前 session 上 PL 的执行情况。 |
| stop_profiler | 关闭性能剖析器,关闭后将结果汇总到数据统计表。 |
| pause_profiler | 暂停性能剖析器,暂停后会暂时停止记录执行情况。 |
| resume_profiler | 恢复性能剖析器,恢复记录执行情况。 |
| flush_data | 将数据汇总到数据统计表。 |
| get_version | 返回当前 DBMS_PROFILER 版本。 |
| internal_version_check | 校验数据库版本与 DBMS_PROFILER 版本是否匹配。 |
| rollup_unit | 计算某次执行中某个单元的执行时间。 |
| rollup_run | 计算某次执行中每个单元的执行时间。 |
| ob_init_objects | 用户 schema 下创建数据统计表。 |
| ob_drop_objects | 用户 schema 下删除数据统计表。 |
调用流程
调用 DBMS_PROFILER.start_profiler 启动性能剖析器,在此之后该 session 中所有 PL 的执行中每一行的执行次数和耗时都会被记录。如果在某些场景下系统需要预热,为了防止预热过程被记录,可以通过 DBMS_PROFILER.pause_profiler 暂停剖析器,当系统预热完成后再通过 DBMS_PROFILER.resume_profiler 开始记录执行情况。待系统当需要分析性能的 PL 执行结束后,调用 DBMS_PROFILER.stop_profiler 关闭性能剖析器,所有记录的数据会汇总到数据统计表中,通过查询数据统计表来分析性能。
如下图所示:

使用示例
创建存储过程 PROC1。
obclient> CREATE OR REPLACE PROCEDURE PROC1 AS -> BEGIN -> NULL; -> END; -> / Query OK, 0 rows affected (0.057 sec)创建存储过程 PROC0:
obclient> CREATE OR REPLACE PROCEDURE PROC0 AS -> BEGIN -> PROC1(); -> END; -> / Query OK, 0 rows affected (0.103 sec)启动性能分析器:
obclient> CALL dbms_profiler.start_profiler(); Query OK, 0 rows affected (1.178 sec)调用 PROC0 存储过程:
obclient> CALL PROC0(); Query OK, 0 rows affected (0.470 sec)执行 PROC0 存储过程。由于已经开启了性能分析器,所以这次调用的数据会被收集起来供后续分析使用。
关闭性能剖析器:
call DBMS_PROFILER.stop_profiler(); Query OK, 0 rows affected (1.238 sec)查看性能分析运行信息:
obclient> SELECT * FROM PLSQL_PROFILER_RUNS; +-------+-------------+-----------+-----------+-------------+----------------+-----------------+--------------+--------+ | RUNID | RELATED_RUN | RUN_OWNER | RUN_DATE | RUN_COMMENT | RUN_TOTAL_TIME | RUN_SYSTEM_INFO | RUN_COMMENT1 | SPARE1 | +-------+-------------+-----------+-----------+-------------+----------------+-----------------+--------------+--------+ | 1 | NULL | SYS | 10-JAN-25 | 10-JAN-25 | 34000000000 | NULL | NULL | NULL | +-------+-------------+-----------+-----------+-------------+----------------+-----------------+--------------+--------+ 1 row in set (0.002 sec)查看被分析单元的信息:
obclient> SELECT * FROM PLSQL_PROFILER_UNITS; +-------+-------------+-----------+------------+-----------+----------------+------------+--------+--------+ | RUNID | UNIT_NUMBER | UNIT_TYPE | UNIT_OWNER | UNIT_NAME | UNIT_TIMESTAMP | TOTAL_TIME | SPARE1 | SPARE2 | +-------+-------------+-----------+------------+-----------+----------------+------------+--------+--------+ | 1 | 500025 | PROCEDURE | SYS | PROCL | 10-JAN-25 | 0 | NULL | NULL | | 1 | 500026 | PROCEDURE | SYS | PROC0 | 10-JAN-25 | 0 | NULL | NULL | +-------+-------------+-----------+------------+-----------+----------------+------------+--------+--------+ 2 rows in set (0.004 sec)从
PLSQL_PROFILER_UNITS表中查询到每个被分析的 PL/SQL 单元的相关信息,如单元类型、名称及总计时间。查看具体行级别的性能数据:
obclient> SELECT * FROM PLSQL_PROFILER_DATA; +-------+-------------+-------+-------------+------------+----------+----------+--------+--------+--------+--------+ | RUNID | UNIT_NUMBER | LINE# | TOTAL_OCCUR | TOTAL_TIME | MIN_TIME | MAX_TIME | SPARE1 | SPARE2 | SPARE3 | SPARE4 | +-------+-------------+-------+-------------+------------+----------+----------+--------+--------+--------+--------+ | 1 | 500025 | 1 | 1 | 537 | 537 | 537 | NULL | NULL | NULL | NULL | | 1 | 500025 | 3 | 1 | 7118 | 7118 | 7118 | NULL | NULL | NULL | NULL | | 1 | 500026 | 1 | 1 | 406 | 406 | 406 | NULL | NULL | NULL | NULL | | 1 | 500026 | 3 | 1 | 16031017 | 16031017 | 16031017 | NULL | NULL | NULL | NULL | +-------+-------------+-------+-------------+------------+----------+----------+--------+--------+--------+--------+ 4 rows in set (0.002 sec)通过查询
PLSQL_PROFILER_DATA表可以查看每个 PL/SQL 单元内部特定行的详细性能统计,包括该行被执行次数、总的执行时间和最小最大执行时间等。