Oracle FAQ定义了临时表空间,如下所示:
临时表空间用于 管理数据库排序的空间 操作和存储全局 临时表。例如,如果你 加入两个大表和Oracle 无法在记忆,空间中进行排序 将临时分配 用于进行排序的表空间 操作
这很好,但我需要更多关于使用空间的详细信息。由于应用程序设计的怪癖,大多数查询都会进行某种排序,因此我需要将其缩小到客户端可执行文件,目标表或SQL语句。
基本上,我正在寻找线索来更准确地告诉我这个(相当大的应用程序)可能有什么问题。任何类型的线索都可能有用,只要它比“排序”更精确。
答案 0 :(得分:16)
我不确定您已经掌握了哪些信息,但使用以下查询将指出哪些程序/用户/会话等当前正在使用您的临时空间。
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,你应该走在正确的道路上。
答案 1 :(得分:3)
一条经验法则是,几乎所有花费超过一秒的查询都可能使用一些TEMP空间,而这些不仅仅涉及ORDER BYs,而且还包括:
有时,临时表空间中的已用空间不会被Oracle释放(bug / quirk),因此您需要手动从表空间中删除文件,将其从文件系统中删除并创建另一个文件。
答案 2 :(得分:3)
感谢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;
这个生成kill语句的脚本: 请查看您将要杀的会议......
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;