1.执行下述SQL,占用TEMP表空间较大的session信息一目了然SELECT V.INST_ID, V.SID, V.SERIAL#, V.USERNAME, V.STATUS, V.ACTION, V.MACHINE, V.MODULE, V.OSUSER, V.TERMINAL, V.PROGRAM, V.SQL_ID, SU.TABLESPACE, (SU.BLOCKS * TO_NUMBER((SELECT RTRIM(VALUE) FROM V$PARAMETER P WHERE P.NAME = 'db_block_size'))) / 1024 / 1024 AS SIZE_M, (SELECT ROUND(SUM(BYTES) / (1024 * 1024), 3) FROM V$TEMPFILE) TEMP_TS_SIZE_M, ROUND((SU.BLOCKS * TO_NUMBER((SELECT RTRIM(VALUE) FROM V$PARAMETER P WHERE P.NAME = 'db_block_size'))) * 100 / (SELECT SUM(BYTES) FROM V$TEMPFILE), 3) C_USED_PERCENT, SU.SEGTYPE, (SELECT A.SQL_TEXT FROM GV$SQLAREA A WHERE A.SQL_ID = NVL(V.SQL_ID,SU.SQL_ID) AND A.INST_ID = V.INST_ID AND ROWNUM = 1) SQL_TEXT, SU.SEGFILE#, SU.SEGBLK#, SU.EXTENTS, SU.BLOCKS, SU.SEGRFNO# FROM GV$SORT_USAGE SU, --GV$TEMPSEG_USAGE GV$SESSION VWHERE SU.SESSION_ADDR = V.SADDR AND SU.INST_ID = V.INST_IDORDER BY SU.INST_ID, SU.BLOCKS DESC GV$SORT_USAGE与GV$TEMPSEG_USAGE可以互相替代。 视图GV$SORT_USAGE中的SEGTYPE列的不同的值所代表的含义如下所示: SORT:SQL排序使用的临时段,包括ORDER BY、GROUP BY、DISTINCT、窗口函数、合并查询(UNION、INTERSECT、MINUS)、索引的创建(CREATE)和重建(REBUILD)、ANALYZE分析表等产生的排序。 DATA:临时表(GLOBAL TEMPORARY TABLE)存储数据使用的段。 INDEX:临时表上建的索引使用的段。 HASH:HASH算法,如HASH连接所使用的临时段。 LOB_DATA和LOB_INDEX:临时LOB使用的临时段。 2.分析占用率过高的会话,确保会话异常或SQL异常后,可以清理该会话:ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;3.会话清理后如表空间不释放,可采用下述办法释放空间:SELECT TS#, NAME FROM V$TABLESPACE WHERE NAME='TEMP';ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME DROP_SEGMENTS LEVEL 4';其中,LEVEL后的值为TS#+1。在以上例子中,TEMP表空间的TS#为3,所以TS#+1=4。4.其他简单粗暴的解决办法:1)重启数据库。2)重建表空间:
/**查看当前的数据库默认表空间**/
SQL>select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
/**确认当前的临时表空间为TEMP**/
/**查看目前临时表空间的大小**/
SQL>select file_name,tablespace_name,bytes/1024/1024 "MB",autoextensible from dba_temp_files;
/**创建另一个临时表空间**/
SQL>create temporary tablespace TEMP2 TEMPFILE 'D:\oradata\temp02.dbf' SIZE 10M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
/**改变缺省临时表空间为刚刚创建的新临时表空间temp2**/
SQL>alter database default temporary tablespace temp2;
/**删除原来临时表空间**/
SQL>drop tablespace temp including contents and datafiles;
/**重新创建临时表空间temp **/
SQL>create temporary tablespace TEMP TEMPFILE 'D:\oradata\temp01.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
/**重置缺省临时表空间为新建的temp表空间**/
SQL>alter database default temporary tablespace temp;
/**删除中转用临时表空间 **/
SQL>drop tablespace temp2 including contents and datafiles;
/**重新指定用户表空间为重建的临时表空间 **/
SQL>alter user yhm temporary tablespace temp;
