我正在使用 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production,并且我在 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;
结果是,上述测试查询的每次执行都需要约12MB的临时表空间,直到我断开会话才能释放。如果我这样做太频繁,就会导致ORA-1652: 无法扩展临时段。
我做错了什么?或者这可能是Oracle的一个错误吗?
while(rSet.next()){...}
循环完成后才被释放。这看起来像是一个错误,但我在 MOS 中看不到任何明显的匹配项 - 18098207 可能相关,但很难确定。有趣的是,如果这可以在其他版本中重现。 - Alex Poole