Question

La FAQ Oracle définit l'espace table temporaire comme suit:

  

Les espaces de table temporaires sont utilisés pour   gérer l'espace pour le tri de la base de données   opérations et pour le stockage global   tables temporaires. Par exemple, si vous   joindre deux grandes tables, et Oracle   ne peut pas faire le tri en mémoire, espace   sera attribué dans un temporaire   espace de table pour faire le tri   opération.

C'est bien, mais j'ai besoin de plus de détails sur l'utilisation exacte de l'espace. En raison des particularités de la conception de l’application, la plupart des requêtes effectuent un certain tri; je dois donc le limiter à l’exécutable du client, à la table cible ou à une instruction SQL.

Essentiellement, je cherche des indices pour me dire plus précisément ce qui pourrait ne pas être correct avec cela (plutôt grande application). N'importe quel indice peut être utile, à condition qu'il soit plus précis que le "tri".

Était-ce utile?

La solution

Je ne sais pas exactement de quelles informations vous disposez déjà, mais l'utilisation de la requête suivante indiquera quel programme / utilisateur / session, etc. utilise actuellement votre espace temporaire.

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;

Une fois que vous avez trouvé quelle session est la cause des dégâts, examinez le code SQL en cours d'exécution et vous devriez être sur le bon chemin.

Autres conseils

Une règle de base est que presque toutes les requêtes qui prennent plus d'une seconde utilisent probablement un espace TEMP, et il ne s'agit pas de celles qui impliquent ORDER BY, mais aussi:

  1. GROUP BYs (SORT GROUPBY avant 10.2 et HASH GROUPBY à partir de 10.2)
  2. HASH JOINs ou MERGE JOINs
  3. Tables temporaires globales (évidemment)
  4. Index reconstruit

Occasionnellement, l'espace utilisé dans les espaces de table temporaires n'est pas libéré par Oracle (bug / erreur), vous devez donc supprimer manuellement un fichier de l'espace de tables, le supprimer du système de fichiers et en créer un autre.

Merci à Michael OShea pour sa réponse,

mais si vous avez plusieurs instances Oracle RAC, vous en aurez besoin ...

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;

et ceci le script pour générer les instructions kill: Veuillez revoir les sessions que vous allez tuer ...

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top