技术开发 频道

Replace操作CLOB致临时表空间泄露

  从逻辑上看,这段代码可以用以下代码进行模拟,

declare

  aaa clob;

begin

  aaa :
= empty_clob();

  aaa :
= 'aaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaabaaaaaaaaaaaaa';

  
for i in 1..10000 loop

    aaa :
= replace(aaa, 'b', ';;');

  
end loop;

end;

  我们知道,在PLSQL中的LOB类型变量是占用临时表空间的。但是,从以上代码看,CLOB变量aaa的初始值并没有占用太大空间。我们在测试环境上运行该语句,用以下语句观察其临时表空间占用情况。

SELECT b.tablespace,

      
ROUND(((b.blocks*p.value)/1024/1024),2)||'M' "SIZE",

       b.CONTENTS,

       s.sql_text,

       a.sid||
','||a.serial# SID_SERIAL,

       a.username,

       a.program,

       sysdate
as log_date

  FROM sys.v_$session a,

       sys.v_$sort_usage b,

       sys.v_$parameter p,

       v$sqlarea s

WHERE p.name  
= 'db_block_size'

  
AND a.saddr = b.session_addr

  
AND a.sql_address = s.address and a.sql_hash_value = s.hash_value

ORDER BY b.tablespace, b.blocks;

TABLESPACE       SIZE     CONTENTS SQL_TEXT SID_SERIAL       USERNAME PROGRAM  LOG_DATE
---------------------------------------------------------------------------------
TEMP     37M      TEMPORARY        declare   aaa clob; begin   aaa :
= empty_clob();   aaa := 'aaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaabaaaaaaaaaaaaa';   for i in 1..1000000000 loop     aaa := replace(aaa, 'a', ';;');   end loop; end;          137,28675        DEMO     plsqldev.exe     8/15/2007 11:42:11
0
相关文章