Oracle数据库绑定变量特性及应用
3. 我怎样知道正在使用绑定变量的方法;
下面举例说明;
创建一个Table;
Create table t (xx int);
执行下面的语句;
Begin
For I in 1..100 loop
Execute immediate’insert into t values(‘|| t ||’)’;
End loop;
end;
现在准备好了脚本,开始创建一个字符串中删除常数的一个函数,它采用的是SQL语句为:
insert into t values(‘hello’,55);
insert into t values(‘world’,56);
将其转换为
insert into t values(‘#’,@);
所有相同的语句很显然是可见的(使用绑定变量);上述两个独特的插入语句经过转换后变成同样的语句; 完成的转换函数为:
Create or replace function remove_constants(p_query in varchar2) return varchar2 as
l_query long;
l_char varchar2(1);
l_in_quates 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_quates then
l_in_quates:=False;
elsif l_char='''' and not l_in_quates then
then
l_in_quates:=true;
l_query=:l_query||'#';
end if
if not l_in_quates then
l_query=:l_query||l_char;
end if;
end loop;
l_query:=tranlate(l_query,'0123456789','@@@@@@@@@');
for i in 1..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;
/
接着我们建立一个临时表去保存V$SQLAREA里的语句,所有 Sql的执行结果都写在这里;
建立临时表;
create global temporary table sql_area_tmp on commit preserve rows as
select sql_text,sql_text sql_text_wo_constants from
v$sqlarea where 1=0;
保存数据到临时表上;
insert into sql_area_tmp(sql_text) select sql_text from v$sqlarea;
对临时表中的数据进行更新;删除掉常数;
Update sql_area_tmp set SQL_TEXT_WO_CONSTANTS= remove_constants(sql_text);
现在我们要找到哪个糟糕的查询
select SQL_TEXT_WO_CONSTANTS,count(*) from sql_area_tmp
group by SQL_TEXT_WO_CONSTANTS
having count(*)>10
order by 2;
SQL_TEXT_WO_CONSTANTS count(*)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
INSERT INTO T VALUES(@) 100
另外, 设定如下参数
Alter session set sql_trace=true;
Alter session set timed_statictics=True;
Alter session set events ‘10046 trace name context forever,level <N>’;
这里的’N’ 表示的是1,4,8,12,详细内容请参考相关文档
Alter session set events ‘10046 trace name context off’;
可以用 TKPROF 工具查看绑顶变量执行的结果,如例子:
declare
l_number number;
l_text varchar2(5);
begin
for i in 1 .. 1000
loop
l_number := i;
l_text := 'test'||to_char(i);
insert into t values(i,l_text);
end loop;
commit;
end;
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.00 0.10 0 0 0 0
Execute 1009 0.09 0.21 0 4 1035 1009
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 1011 0.09 0.31 0 4 1035 1009
0
相关文章