代码之家  ›  专栏  ›  技术社区  ›  Simon Gibbs

发现使用oracle临时表空间的进程/查询

  •  10
  • Simon Gibbs  · 技术社区  · 16 年前

    管理数据库排序的空间 用于存储全局 临时桌子。例如,如果你 连接两个大表,然后使用Oracle 无法在内存、空间中进行排序 将以临时方式分配 活动

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

    3 回复  |  直到 16 年前
        1
  •  17
  •   Michael OShea    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,您应该走上了正确的道路。

        2
  •  4
  •   Najee Ghanim    7 年前

    感谢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;
    
        3
  •  3
  •   Andrew not the Saint    16 年前

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

    1. 分组依据(10.2之前的排序依据和10.2之后的哈希分组依据)
    2. 散列联接或合并联接
    3. 索引重建