Oracle 11g - 临时表空间段未发布(Oracle 错误?)

Posted

技术标签:

【中文标题】Oracle 11g - 临时表空间段未发布(Oracle 错误?)【英文标题】:Oracle 11g - Temp Tablespace Segments don't get released (Oracle Bug?) 【发布时间】:2015-10-01 20:27:03 【问题描述】:

我正在使用Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production,我在 TOAD 12.6.0.53 中执行的以下查询存在问题 em>(不是典型的查询,只是为了演示):

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 的 Temp 表空间,直到我断开会话后才会释放。 如果我经常这样做,它也会导致ORA-1652:无法扩展临时段

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

【问题讨论】:

我在 11.2.0.3 中没有看到带有 PL/SQL 块的效果,而普通 SQL 的效果更小。您的临时表空间真的是临时的,还是使用永久段 - dba_tablespaces.contents 显示什么? (如果您有访问权限,MOS 注释 1039341.6 可能是相关的,因为我可以看到 v$sortsegments.user_blocks 增长,同样仅使用纯 SQL)。 实际上,在 SQL*Plus 中,我也没有在纯 SQL 版本中看到它;但我在 SQL Developer 中看到了它——仅当结果集中有尚未获取和显示的行时——所以查询仍然处于活动状态。我猜蟾蜍正在做类似的事情? 感谢您的反馈,这是我关于 PL/SQL 块的错误,它没有显示行为。我检查了 dba_tablespaces.contents - 它是“TEMPORARY”而不是“PERMANENT” 我也可以从一个简单的 Java 程序中重现(SQL Developer 和 Toad 都通过 JDBC 运行);将查询执行到结果集中会占用临时空间,除非我遍历整个结果集,否则它不会被释放。关闭结果集或准备好的语句不会释放临时段,它们仅在 while (rSet.next()) ... 循环完成后才被释放。我认为这看起来像一个错误,但我在 MOS 中看不到任何明显的匹配 - 18098207 可能是相关的,但很难说。看看这是否可以在其他版本中重现会很有趣。 在 10.2.0.5 中没有完全重现。段没有被 rSet.close() 释放,但第二次执行似乎重用了相同的段,并且它们被 pStmt.close() 释放。并且仍然通过完全循环结果集来释放。我没有任何其他版本可以方便地测试。可能值得提出有关此行为的服务请求。 【参考方案1】:

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

使用 EM 更好地增加 TEMP 空间

优化使用较少 TEMP 的查询

【讨论】:

以上是关于Oracle 11g - 临时表空间段未发布(Oracle 错误?)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g 学习3——表空间操作

Oracle11g创建表空间

Oracle11g创建表空间语句

oracle 创建表空间及oracle 11g表空间之最大最小

oracle 11g手工热备-表空间

Oracle11g 脚本创建表空间和用户