簡體   English   中英

發現使用oracle臨時表空間的進程/查詢

[英]Discover what process/query is using oracle temp tablespace

Oracle FAQ定義了臨時表空間,如下所示:

臨時表空間用於管理數據庫排序操作和存儲全局臨時表的空間。 例如,如果連接兩個大表,並且Oracle無法在內存中進行排序,則會在臨時表空間中分配空間以執行排序操作。

這很棒,但我需要更多關於使用空間的詳細信息。 由於應用程序設計的怪癖,大多數查詢都會進行某種排序,因此我需要將其縮小到客戶端可執行文件,目標表或SQL語句。

從本質上講,我正在尋找線索來更准確地告訴我這個(相當大的應用程序)可能有什么問題。 任何形式的線索都可能有用,只要它比“分類”更精確。

我不確定您已經掌握了哪些信息,但使用以下查詢將指出哪些程序/用戶/會話等當前正在使用您的臨時空間。

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,你應該走在正確的道路上。

一條經驗法則是,幾乎所有花費超過一秒的查詢都可能使用一些TEMP空間,而這些不僅僅涉及ORDER BYs,而且還包括:

  1. GROUP BYs(10.2之前的SORT GROUPBY和10.2之后的HASH GROUPBY)
  2. HASH JOINs或MERGE JOINs
  3. 全球臨時表(顯然)
  4. 索引重建

有時,臨時表空間中的已用空間不會被Oracle釋放(bug / quirk),因此您需要從表空間手動刪除文件,將其從文件系統中刪除並創建另一個文件。

感謝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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM