技术开发 频道

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
相关文章