如何查看DB2存储过程中各语句的执行耗时
定位DB2存储过程中耗时的INSERT SELECT语句
方法1:利用DB2内置监控机制
- 开启语句级监控:执行
db2 update monitor switches using statement on开启监控,运行目标存储过程后,执行db2 get snapshot for dynamic sql on <你的数据库名>,在结果中筛选包含INSERT ... SELECT的语句,查看其Execution Time字段获取耗时。 - 查询系统视图:直接通过系统视图筛选目标语句,执行:
SELECT SUBSTR(stmt_text, 1, 300) AS stmt_content, exec_time / 1000000 AS exec_seconds, num_executions FROM sysibmadm.snapdyn_sql WHERE stmt_text LIKE '%INSERT%SELECT%'
该语句会返回所有INSERT SELECT语句的内容、执行时长(秒)和执行次数。
方法2:在存储过程中嵌入计时逻辑
手动为每个INSERT SELECT添加时间戳记录,示例如下:
DECLARE v_start TIMESTAMP; -- 第一条INSERT SELECT计时 SET v_start = CURRENT_TIMESTAMP; INSERT INTO target_table_a SELECT col1, col2 FROM source_table_a WHERE ...; -- 将耗时写入日志表 INSERT INTO proc_perf_log(proc_name, stmt_detail, exec_duration) VALUES('你的存储过程名', 'INSERT INTO target_table_a SELECT ...', CURRENT_TIMESTAMP - v_start); -- 后续INSERT SELECT重复上述计时逻辑
执行存储过程后,查询proc_perf_log表即可获取每条语句的精确耗时。
方法3:通过执行计划辅助定位瓶颈
- 生成存储过程执行计划:执行
db2 explain plan for call 你的存储过程名(),然后查询SYSPLAN_STATEMENTS系统表,找到对应INSERT SELECT语句的执行节点,查看ESTIMATED_COST和ACTUAL_ROWS等字段,结合实际耗时判断是否存在全表扫描、索引缺失等问题。 - 使用
db2exfmt工具格式化执行计划,命令为db2exfmt -d <数据库名> -g TIC -w -1 -n % -s % -o plan_output.txt,在输出文件中可直观看到每条INSERT SELECT的执行路径和成本。
内容的提问来源于stack exchange,提问作者user14762650
相关产品推荐
相关产品推荐

