2008-10-06 7 views
10

Oracle FAQ definiert Raum temporäre Tabelle wie folgt:Entdecken Sie, was Prozess/Abfrage mit Oracle temporäre Tabellen

Temporäre Tablespaces verwendet werden, um Raum verwalten für Datenbank-Sortier Operationen und für die globale temporäre Tabellen zu speichern. Wenn Sie beispielsweise zwei große Tabellen verknüpfen und Oracle die Sortierung im Speicher nicht ausführen kann, wird der Speicherplatz in einem temporären Tablespace für die Operation zugeordnet.

Das ist großartig, aber ich brauche mehr Details darüber, was genau den Raum nutzt. Aufgrund der Eigenarten des Anwendungsdesigns werden die meisten Abfragen sortiert, weshalb ich sie auf die ausführbare Datei des Clients, die Zieltabelle oder die SQL-Anweisung eingrenzen muss.

Im Wesentlichen suche ich nach Hinweisen, um mir genauer zu sagen, was mit dieser (ziemlich großen Anwendung) falsch sein könnte. Irgendeine Art von Anhaltspunkt könnte nützlich sein, solange es genauer ist als "Sortieren".

Antwort

15

Ich bin mir nicht sicher, welche Informationen Sie bereits übergeben müssen, aber die Verwendung der folgenden Abfrage zeigt an, welches Programm/Benutzer/Sitzungen usw. Ihren temporären Speicherplatz gerade verwenden.

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; 

Sobald Sie herausfinden, welche Sitzung den Schaden tut, haben dann einen Blick auf die SQL ausgeführt wird, und Sie sollten auf dem richtigen Weg sein.

3

Eine Faustregel ist, dass fast jede Abfrage, die wahrscheinlich mehr als eine Sekunde dauert einige TEMP Raum verwendet, und diese sind nicht die Gerechten ORDER BYs beteiligt, sondern auch:

  1. GROUP BYs (SORT GROUPBY vor 10.2 und HASH GROUPBY von 10,2 an)
  2. Hashverknüpfungen oder MERGE JOIN
  3. globale temporäre Tabellen (natürlich)
  4. Index neu erstellt

Gelegentlich wird verwendeter Speicherplatz in temporären Tablespaces nicht von Oracle freigegeben (bug/quirk), daher müssen Sie eine Datei manuell aus dem Tablespace löschen, aus dem Dateisystem löschen und eine andere Datei erstellen.

+0

wird all das v $ sort_usage aufgezeichnet werden? –

+0

Gemäß den Oracle-Dokumenten enthält V $ TEMPSEG_USAGE alle verschiedenen Operationen, die TEMP-Speicherplatz benötigen. –

3

Vielen Dank für Michael OShea für seine Antwort geht,

aber falls Sie Oracle RAC mehrere Instanzen haben, dann müssen Sie diese ...

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; 

und dieses das Skript das Kill zu erzeugen Erklärungen: Bitte überprüfen, welche Sitzungen Sie töten wird ...

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; 
+0

Das ist Gold. Vielen Dank! –

Verwandte Themen