收缩临时表空间

        当排序操作、重建索引等大型操作无法在内存中完成时,临时表空间将为排序提供便利。一般情况下临时表空间为多个用户,多个会话所共
享。不能为会话分批空间配额。临时表空间耗用过度且在不能自动扩展的情形下将收到“ORA-1652:unable to extend temp segment” 错误.下面
描述了过度扩展后如何释放临时表空间。

与之相关的内容参考:
        Oracle 表空间与数据文件
        临时表空间的管理与受损恢复
        Oracle 彻底 kill session

一、临时表空间何时释放
        检索数据的会话游标关闭时,占用的临时空间即被释放
        数据库关闭,重启(一般情况),会话 log off

二、释放过大的临时表空间

三、总结
1、关注alert_<sid>.log文件中的ORA-1652错误并调查什么原因导致该错误。有些时候并不是由于当前的SQL 导致临时表空间不能扩展,很可能
        由于前一个SQL耗用了99%的临时表空间,而后一个SQL执行时即出现错误。对于此类情况应调查前一SQL并调整避免过多的磁盘排序。
2、如果基于空间压力应该关闭临时表空间的自动扩展。因此为临时表空间设定合理的大小就成了一个问题。个人的解决方案是首先检查ORA-1652
    其次是观察业务高峰期的峰值。如前面查询中的字段Max Size(: Maximum number of MB ever used)的值来预估。如果大师们有更好的建议
    不妨拍砖。
3、通过重启数据库,临时表空间所耗用的大小有时候并不能缩小。
4、在Oracle 11g之前一般是通过创建中转临时表空间来达到缩小的目的。不是很完美,因为有些时候临时段未释放导致不能删除临时表空间及
        数据文件。在11g可以直接使用下面的命令来完成:
        alter tablespace temp shrink space;
        alter tablespace temp shrink tempfile '<dir>' keep n <mb/kb>;
5、系统缺省的临时表空间不能被删除,因此如果系统缺省的临时表空间过大删除前应该新置一个系统缺省的临时表空间。
6、删除过大临时表空间前其上的用户应该先将其设定到中转临时表空间,重建后再将其置回原状态。
7、减少磁盘排序的首要任务调整SQL,如避免笛卡尔积,为表添加合理的索引等。其次要考虑PGA的值是否设定合理。

四、相关参考
        Oracle 表空间与数据文件
        临时表空间的管理与受损恢复
        Oracle 彻底 kill session
posted @ 2011-12-09 18:02  ajuanabc  阅读(143)  评论(0编辑  收藏  举报