Entdecken Sie, was Prozess / Abfrage mit Oracle temporäre Tabellen
-
05-07-2019 - |
Frage
Oracle FAQ definiert Raum temporäre Tabelle wie folgt:
Temporäre Tablespaces werden verwendet, um verwalten Platz für Datenbank-Sortier Operationen und zum Speichern von globalen temporäre Tabellen. Zum Beispiel, wenn Sie kommen zwei große Tische und Oracle kann die Art im Speicher nicht tun, Raum wird in einem temporären zugeordnet werden Tabellen für das Erledigen der Art Betrieb.
Das ist toll, aber ich brauche mehr Details darüber, was genau den Raum verwendet. Aufgrund Macken des Anwendungsdesigns meisten Abfragen machen eine Art von Sortierung, so muß ich es Client ausführbar, Zieltabelle, oder SQL-Anweisung verengen.
Im Wesentlichen, ich suche nach Hinweisen mir zu sagen, genauer gesagt, was mit dieser (ziemlich großen Anwendung) falsch sein könnte. Jede Art von Ahnung, könnte nützlich sein, so lange es präziser ist als „Sortierung“.
Lösung
Ich bin nicht sicher genau das, was Informationen, die Sie bereits übergeben müssen, aber die folgende Abfrage verwendet, wird darauf hinweisen, welches Programm / user / Sitzungen usw. sind zur Zeit Ihre temporären Raum verwendet wird.
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;
Wenn Sie herausfinden, welche Sitzung den Schaden zu tun, dann haben Sie einen Blick auf die SQL ausgeführt wird, und Sie sollten auf dem richtigen Weg sein.
Andere Tipps
Eine Daumenregel ist, dass fast jede Abfrage, die mehr als eine Sekunde dauert wahrscheinlich einigen TEMP Raum verwendet, und dies sind nicht die Gerechte ORDER BYs beteiligt, sondern auch:
- GROUP BYs (SORT GROUPBY vor 10.2 und HASH GROUPBY von 10,2 an)
- Hashverknüpfungen oder MERGE JOIN
- Globale temporäre Tabellen (natürlich)
- Index neu erstellt
Gelegentlich, belegter Speicherplatz in temporärer Tablespaces nicht von Oracle freigegeben bekommt (Bug / Marotte), so müssen Sie manuell eine Datei aus dem Tabellenbereich fallen, ist es aus dem Dateisystem löschen und eine anderen erstellen.
Dank geht für Michael OShea für seine Antwort,
aber falls Sie haben Oracle RAC mehrere Instanzen, 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 dies das Skript der Kill-Anweisungen zu generieren: Bitte überprüfen Sie, welche Sitzungen werden Sie zu töten sein ...
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;