-
Vider la table TEMP
Bonjour,
j'ai lancé une proc sur ma base de données et celle-ci dure de plus en plus longtemps.
Je me suis aperçu que la table TEMP (temp01.dbf) était à 99%, comment puis je faire pour la vider et permettre de libérer de l'espace afin que ma requête s'exécute plus rapidement.
Merci
-
Tu as lancé une requête qui prend du temps c'est ça ?
Et si tu rajoutes des dbf à ton tablespace ?
-
bonsoir,
il faut reprendre les bases. quand on parle de .dbf, on parle donc d'un espace physique, un datafile, ou un tempfile dans ce cas plus probablement.
voici quelques pistes :
- le tablespace temporaire contient des objets... temporaires. plus ou moins temporaires : le résultat de tris qui ne tiennent pas en pga mais il peut aussi contenir des tables temporaires, des lobs temporaires, des curseurs ouverts... s'il n'y a pas d'ora 1652 dans l'alert.log, c'est qu'il est encore assez grand pour contenir ce qu'on lui demande. rajouter de l'espace ne réduira pas le temps d'exécution mais permettra à la requête d'aboutir si elle manque d'espace
- c'est mieux de trier en mémoire (pga) plutôt que sur disque (tempfiles)
-on ne vide pas un tempfile comme on vide une poubelle. si vous supprimez ce qu'oracle a fait pour votre requête, elle n'aboutira jamais. regardez ce que contient ce tempfile (v$sort_usage, joint avec v$session); vous constaterez peut-être que d'autres utilisateurs utilisent ce fichier en même temps que votre requête problématique.
- si une requête prend trop de temps, c'est le premier réflexe à avoir, il faut la revoir, examiner son plan d'exécution, voir s'il a changé, arranger la requête elle même éventuellement, les chemins d'accès, vérifier l'exactitude des statistiques sur les tables et index. il y a sûrement une jointure très gourmande qui consomme des ressources.
merci de nous donner plus de matière.
une bonne habitude à prendre quand on poste un problème : version Oracle, requête, plan d'exécution, traces...
bonne soirée
-
Bonjour ,
J'en profite du sujet pour poser une question :)
En effet je ne comprends pas pourquoi oracle dans certains cas le tablespace TEMP est rempli à 100% et la requête continue à tourner quand même(avec probablement une régression ...)
Et parfois c'est une erreur ORA- qui se déclenche car le TEMP a explosé ?
Pourquoi ce comportement différent ? Cela dépend de quoi au juste ?
Merci pour vos explications.
-
bonsoir,
la requête qui tombe en ora-1652 est celle qui a besoin de plus d'espace que l'espace libre dans le TEMP. ce n'est pas forcément la plus consommatrice de toutes. une autre requête peut tourner depuis un moment, sans rencontrer l'ora-1652, car elle a utilisé tout l'espace de tri qui lui était nécessaire, mais s'il ne reste pas assez d'espace pour la requête 2, cette dernière tombe en erreur.
le temp (de type temporaire) peut paraître full... car il ne se vide qu'au shutdown. la vue v$sort_segment montre le nombre de blocs total qui est la somme des blocs utilisés et des blocs libres. pendant le tri les blocs sont alloués puis sont marqués comme free, rendus au sort extent pool, quand ils ne sont plus nécessaires et ils peuvent alors être utilisés par un autre process.
vous trouverez facilement des requêtes pour trouver quel est l'espace réellement disponible dans le temp et quelle query (et quelle session) utilise ce tablespace.