我正在使用 Oracle Database 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;
执行此查询后,我可以使用此查询检查临时表空间的用法:
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;
结果是,每次执行上面的testquery都需要大约12MB的 Temp Tablespace ,直到断开会话才会释放。 如果我经常这样做,它也导致 ORA-1652:无法扩展临时段。
我做错了什么?或者这可能是一个oracle bug?
答案 0 :(得分:0)
TEMP表空间有一些有限的磁盘空间。当你运行查询时,它开始越来越多地使用TEMP空间,直到它达到极限并且给出错误无法扩展TEMP,所以可能有两个解决方案
使用EM
优化使用较少TEMP的查询