这是一个在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, 这话总是没错.