12

Oracle FAQ 对临时表空间的定义如下:

临时表空间用于管理数据库排序操作和存储全局临时表的空间。例如,如果您连接两个大表,而 Oracle 无法在内存中进行排序,则会在临时表空间中分配空间来进行排序操作。

这很好,但我需要更多关于究竟是什么在使用该空间的详细信息。由于应用程序设计的怪癖,大多数查询都会进行某种排序,因此我需要将其缩小到客户端可执行文件、目标表或 SQL 语句。

本质上,我正在寻找线索来更准确地告诉我这个(相当大的应用程序)可能有什么问题。任何类型的线索都可能有用,只要它比“排序”更精确。

4

3 回答 3

18

我不确定您已经提交了哪些信息,但使用以下查询将指出哪些程序/用户/会话等当前正在使用您的临时空间。

SELECT   b.TABLESPACE
       , b.segfile#
       , b.segblk#
       , ROUND (  (  ( b.blocks * p.VALUE ) / 1024 / 1024 ), 2 ) size_mb
       , a.SID
       , a.serial#
       , a.username
       , a.osuser
       , a.program
       , a.status
    FROM v$session a
       , v$sort_usage b
       , v$process c
       , v$parameter p
   WHERE p.NAME = 'db_block_size'
     AND a.saddr = b.session_addr
     AND a.paddr = c.addr
ORDER BY b.TABLESPACE
       , b.segfile#
       , b.segblk#
       , b.blocks;

一旦你发现哪个会话造成了损害,然后看看正在执行的 SQL,你应该走在正确的道路上。

于 2008-10-06T15:30:37.357 回答
4

感谢 Michael OShea 的回答,

但是如果您有 Oracle RAC 多个实例,那么您将需要这个...

SELECT   b.TABLESPACE
       , b.segfile#
       , b.segblk#
       , ROUND (  (  ( b.blocks * p.VALUE ) / 1024 / 1024 ), 2 ) size_mb
       , a.inst_ID
       , a.SID
       , a.serial#
       , a.username
       , a.osuser
       , a.program
       , a.status
    FROM gv$session a
       , gv$sort_usage b
       , gv$process c
       , gv$parameter p
   WHERE p.NAME = 'db_block_size'
     AND a.saddr = b.session_addr
     AND a.paddr = c.addr
     -- AND b.TABLESPACE='TEMP2'
ORDER BY a.inst_ID , b.TABLESPACE
       , b.segfile#
       , b.segblk#
       , b.blocks;

这是生成终止语句的脚本:请查看您将要终止的会话...

SELECT  b.TABLESPACE, a.username , a.osuser , a.program , a.status ,
       'ALTER SYSTEM KILL SESSION '''||a.SID||','||a.SERIAL#||',@'||a.inst_ID||''' IMMEDIATE;'
    FROM gv$session a
       , gv$sort_usage b
       , gv$process c
       , gv$parameter p
   WHERE p.NAME = 'db_block_size'
     AND a.saddr = b.session_addr
     AND a.paddr = c.addr
     -- AND b.TABLESPACE='TEMP'
ORDER BY a.inst_ID , b.TABLESPACE
       , b.segfile#
       , b.segblk#
       , b.blocks;
于 2015-01-22T08:24:12.770 回答
3

一条经验法则是,几乎所有耗时超过一秒的查询都可能使用一些 TEMP 空间,而且这些不仅仅是涉及 ORDER BY 的查询,还包括:

  1. GROUP BYs(10.2 之前的 SORT GROUPBY 和 10.2 之后的 HASH GROUPBY)
  2. HASH JOIN 或 MERGE JOIN
  3. 全球临时表(显然)
  4. 索引重建

有时,临时表空间中的已用空间不会被 Oracle 释放(错误/怪癖),因此您需要手动从表空间中删除一个文件,从文件系统中删除它并创建另一个文件。

于 2008-10-06T23:28:36.220 回答