Oracle 11g - 临时表空间段不会发布(Oracle Bug?)

ber*_*ner 5 sql oracle oracle11g

我正在使用Oracle数据库11g企业版11.2.0.4.0版 - 64位生产,我在TOAD 12.6.0.53中执行以下查询时出现问题(不是典型查询,但仅用于演示):

with rownums 
as (select distinct 
    rownum rn 
      from dual 
   connect by level <=1000000 
) 
select rn from rownums 
 union all
select rn from rownums;

--Edit: this Statement ist NOT showing the behaviour:
begin
    for cRow in (with rownums 
                as (select distinct 
                    rownum rn 
                      from dual 
                   connect by level <=1000000 
                ) 
                select rn from rownums 
                 union all
                select rn from rownums) 
    loop
        return;
    end loop;
end;
Run Code Online (Sandbox Code Playgroud)

执行此查询后,我可以使用此查询检查临时表空间的用法:

SELECT S.sid, S.serial#, SUM (T.blocks) * TBS.block_size / 1024 / 1024 used_mb, T.tablespace
  FROM v$sort_usage T, v$session S, dba_tablespaces TBS
 WHERE T.session_addr = S.saddr
   AND T.tablespace = TBS.tablespace_name
   and s.sid = sys_context('userenv','sid')
 GROUP BY S.sid, S.serial#, TBS.block_size, T.tablespace;
Run Code Online (Sandbox Code Playgroud)

结果是,每次从上面执行testquery都需要大约12MB的临时表空间,直到断开会话才会释放.如果我经常这样做,它也导致ORA-1652:无法扩展临时段.

我究竟做错了什么?或者这可能是一个oracle bug?

小智 0

TEMP 表空间有一些有限的磁盘空间。当您运行查询时,它开始越来越多地使用 TEMP 空间,直到达到其限制并给出错误 can'textend TEMP ,因此可能有两种解决方案

  • 使用 EM 更好地增加 TEMP 空间

  • 优化使用较少 TEMP 的查询