查看临时段使用情况:

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    V
 WHERE SU.SESSION_ADDR = V.SADDR
   AND SU.INST_ID = V.INST_ID
 ORDER BY SU.INST_ID,  SU.BLOCKS DESC
;
----------------------------------
SELECT username,
       sid,
       serial#,
       sql_address,
       machine,
       program,
       tablespace,
       segtype,
       contents
  FROM v$session se, v$sort_usage su
 WHERE se.saddr = su.session_addr
/

视图GV$SORT_USAGE中的SEGTYPE列的不同的值所代表的含义如下:

1)SORT:SQL 排序使用的临时段,包括 ORDER BY、GROUP BY、DISTINCT、窗口函数(WINDOW FUNCTION,如 ROLLUP)、合并查询(UNION、INTERSECT、MINUS)、索引的创建(CREATE)和重建(REBUILD)、ANALYZE分析表等产生的排序。
2)DATA:临时表(GLOBAL TEMPORARY TABLE)存储数据使用的段。
3)INDEX:临时表上建的索引使用的段。
4)HASH:HASH算法,如HASH连接所使用的临时段。
5)LOB_DATA和LOB_INDEX:临时LOB使用的临时段。
根据上述的段类型,说明TEMP表空间大体可以分为4类占用:①SQL语句排序。②Hash Join占用。③临时表、临时表上的索引占用。④LOB对象占用。

在找到了哪些会话占用临时表空间过大后,分析这些会话,确保会话异常或 SQL 异常后,接着就可以将这些会话清理掉,如下:

alter system kill session 'sid,searial#' immediate;

TEMP表空间回缩:

SQL>Alter tablespace TEMP coalesce;

使用诊断事件来清理临时段::

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。如果想清除所有表空间的临时段,那么TS#设置为2147483647。

https://lhrbest.blog.csdn.net/article/details/102763335