博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
采集数据库中未绑定变量的sql
阅读量:6161 次
发布时间:2019-06-21

本文共 1756 字,大约阅读时间需要 5 分钟。

今天同事收到hard parse的报警,在监控系统中看到hard parse的值比平时高出了数十倍,通常情况下是由于应用程序中的sql未绑定变量导致,在江枫的工具中还没有采集未绑定变量的sql,于是在网上看到一个,该脚本将V$sqlarea中的sql通过一个函数对查询条件中的出现的‘’的地方用‘#’代替,出现数字的地方用@代替,比如:

select * from test where name=‘test‘—替换为:select * from test where name=’#’;

select * from test where id=12—-替换为:select * from test where id=@;

该函数为:

create or replace function

remove_constants( p_query in varchar2 ) return varchar2
as
l_query long;
l_char  varchar2(1000);
l_in_quotes boolean default FALSE;
begin
for i in 1 .. length( p_query )
loop
l_char := substr(p_query,i,1);
if ( l_char = ”” and l_in_quotes )
then
l_in_quotes := FALSE;
elsif ( l_char = ”” and NOT l_in_quotes )
then
l_in_quotes := TRUE;
l_query := l_query || ”’#’;—–遇到’‘则替换为#
end if;
if ( NOT l_in_quotes ) then
l_query := l_query || l_char;
end if;
end loop;
l_query := translate( l_query, ‘0123456789’, ‘@@@@@@@@@@’ );–遇到数字则替换为@
for i in 0 .. 8 loop
l_query := replace( l_query, lpad(‘@’,10-i,’@’), ‘@’ );
l_query := replace( l_query, lpad(‘ ‘,10-i,’ ‘), ‘ ‘ );
end loop;
return upper(l_query);
end;
/
然后将统计过程封装一下:
create or replace procedure find_no_bind_sql(limit_rows number,
my_cursor  out sys_refcursor) as
————– limit_rows参数为控制V$sqlarea中出现的sql的次数
v_sqlerrm varchar2(200);
begin
open my_cursor for
select t.sql_text_to_constants, count(*)
from (select sql_text,
remove_constants(sql_text) sql_text_to_constants
from v$sqlarea) t
group by t.sql_text_to_constants
having count(*) > limit_rows
order by 2;
exception
when others then rollback;
v_sqlerrm := substr(sqlerrm, 1, 200);
dbms_output.put_line(v_sqlerrm);
end find_no_bind_sql;
/
调用:
SQL> var a refcursor
SQL> exec find_no_bind_sql(3,:a);
SQL>  print a
SQL_TEXT_TO_CONSTANTS                                COUNT(*)
SELECT * FROM test I WHERE NAME=’#’           6
SELECT * FROM test WHERE ID=@                      7

转载地址:http://iylfa.baihongyu.com/

你可能感兴趣的文章
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
Activity生命周期
查看>>
高仿UC浏览器弹出菜单效果
查看>>
Ubuntu忘记密码,进不了系统的解决方法
查看>>
[原创]白盒测试技术思维导图
查看>>
<<Information Store and Management>> 读书笔记 之八
查看>>
Windows 8 开发之设置合约
查看>>
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>