Oracle 9i临时LOB对象过多使用临时表空间的一个错误设计

    这是一个在Oracle 9i上的Bug, 问题发现于数据库从8i升级到9i时, 发现占用了大量的临时段. 与其说是Bug, 更不如说Oracle故意如此, 因为Oracle说这不是Bug, 而是其设计上如此. 我们在一个Session中做实验(9i)就可以了, 你可以想象一下如果你有几百个会话都在调用有临时LOB对象的角本, 而TEMP表空间的UNIFORM SIZE设得又比较大时, 总共需要多少临时空间?.

ASQL> declare
    2  a clob;
    3 begin
    4  a := 'abc';
    5 end;
    6 /

Procedure executed.

ASQL> ora sort

SID USERNAME BLOCKS TABLESPACE SEGTYPE 
--- -------- ------ ---------- --------
547 ANYSQL      128 TEMP01    LOB_DATA
 
1 rows returned.

    在Oracle 8i中试验一下:

ASQL> declare
    2  a clob;
    3 begin
    4  dbms_lob.createtemporary(a,true);
    5  dbms_lob.write(a,3,1,'abc'); 
    6 end;
    7 /

Procedure executed.

ASQL> ora sort

0 rows returned.

    在OLTP中, 一般大量的会话都是Cache起来的, 也就是说登上来后不会马上退出的, 而这个Bug是说CLOB变量占用的临明表表空的空间不会释放, 在上面的例子(9i)中, 虽然PL/SQL已经执行完毕, 但空间并没有释放, 这时如果大量的会话上来, 而临表表空间的Inital Extent较大的话, 就会浪费大量的空间了. 这个问题在8i中并不存在. 新版本总是伴随着新的Bug, 这话总是没错.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • I have some difficulty in expressing myself.
  • 我表达起来有点困难.
  • I'm always confused with
  • "s" and "th". 我常把s和th搞混.
  • Can you write in English?
  • 你能用英文写文章吗?
  • Your pronunciation is excellent.
  • 你的发音很好.
  • How can I improve my spoken English?
  • 我该怎样才能提高口语水平?