1. 优化背景:客户反馈一个报表单次查询超过 1 分钟
2. 优化过程,和开发沟通页面调用具体 sql ,存储过程中通过 dblink 调用其他库的多个视图,将存储过程内容修改成 declare 块,添加 DBMS_OUTPUT.PUT_LINE 输出每一步执行时间,定位到下面的sql 执行时间长
-- 远程数据库执行
select *
from cb_01_01
where JITAINAME in
( SELECT REGEXP_SUBSTR( ' 股份 39 号机 ' , '[^,]+' , 1 , rownum )
FROM dual
CONNECT BY rownum <=
LENGTH ( ' 股份 39 号机 ' ) -
LENGTH (regexp_replace( ' 股份 39 号机 ' , ',' , '' )) + 1 )
and COLLECTIONTIMES <= '2024-10-10 23:59:59'
and COLLECTIONTIMES >= '2024-10-01 00:00:00' ;


--cb_01_01 的内容



-- 对语句进行修改
select *
from cb_01_01
where jitai in ( select pk_defdoc from bd_defdoc where ( dr = 0 or dr is null ) and name in
( SELECT REGEXP_SUBSTR( ' 股份 39 号机 ' , '[^,]+' , 1 , rownum )
FROM dual
CONNECT BY rownum <=
LENGTH ( ' 股份 39 号机 ' ) -
LENGTH (regexp_replace( ' 股份 39 号机 ' , ',' , '' )) + 1 ))
and COLLECTIONTIMES <= '2024-10-10 23:59:59'
and COLLECTIONTIMES >= '2024-10-01 00:00:00' ;


-- 修改后的语句到源库执行,时间还是 26 秒多

-- 使用 drving_site 解决查询问题,执行时间 2.5 秒左右

-- 用上面的语句替换存储过程中的内容,执行时间还是要 1 分钟左右,问题原因为 ddl 、 dml 语句中 drving_site 不生效,通过使用游标将数据 insert 到临时表

-- 这时存储过程执行时间从 1 分钟多到 32 秒左右,继续看下一段慢的 sql 。



-- 最终查询的表和上面的临时表一样直接使用上面的临时表

存储过程的执行时间从原来的 1 分钟多到 6 秒左右,业务核对存储过程修改前后报表结果进行对比,数据一致