Oracle a besoin d'informations UNDO pour restaurer le fichier DML dans la transaction. Comme Gary met dans son commentaire:
« Undo est nécessaire pour rollback Il est également nécessaire effets d'une seule déclaration si elle échoue partiellement par de prévoir une ROLLBACK TO SAVEPOINT ou. ROLLBACK (bien que pour GLOBAL TEMPORARY TABLES le dernier ne serait pertinent que pour la session durée GTT). "
Cette information UNDO génère elle-même des données REDO. Il n'y a rien que vous pouvez faire à propos de cette situation: les tables temporaires ont besoin d'UNDO et c'est la fin.
Pour minimiser la quantité de UNDO est assez simple: il suffit d'insérer des enregistrements et sélectionner des enregistrements. INSERT génère la plus petite quantité de UNDO, car l'annulation d'un INSERT nécessite simplement l'attribut rowid. Inversement, les instructions DELETE génèrent le plus d'UNDO, car la base de données doit stocker l'intégralité de l'enregistrement. Fondamentalement, pour annuler un problème INSERT un DELETE, pour annuler un problème DELETE un INSERT. Un UPDATE génère une quantité variable de UNDO, car nous avons besoin des anciennes versions des colonnes modifiées; plus les colonnes sont modifiées et plus elles sont grandes, plus la quantité d'UNDO générée est importante.
Démonstration
En séance un utilisateur insère un grand nombre d'enregistrements dans une table temporaire, puis de les supprimer. Dans la deuxième session, un administrateur de base de données surveillera l'utilisation de l'opération UNDO de la transaction.
SSN1> insert into gtt23
2 select * from big_table
3/
553928 rows created.
SSN1>
utilisation Annuler:
SSN2> select space, noundo, used_ublk, used_urec from v$transaction
2/
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 257 10816
SSN2>
Maintenant, la suppression:
SSN1> delete from gtt23
2/
553928 rows deleted.
SSN1>
utilisation Undo (plusieurs échantillons au cours d'une longue déclaration de fonctionnement) ::
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 11123 435605
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 13413 525452
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 14552 570567
SSN2>
Commit (la table temporaire a une transaction portée à-dire EFFACER rows)
SSN1> commit
2/
Commit complete.
SSN1>
d'utilisation Annuler:
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
no rows selected
SSN2>
L'utilisation d'annulation est accumulative:
SSN1> insert into gtt23
2 select * from big_table
3/
553928 rows created.
SSN1> delete from gtt23
2/
553928 rows deleted.
SSN1> insert into gtt23
2 select * from big_table
3/
553928 rows created.
SSN1>
Undo utilisation
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 258 10816
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 14766 579495
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 14819 581685
SSN2>
Donc, pour minimiser l'impact de UNDO qu'une table temporaire génère, assurez-vous d'insérer les bonnes données, une fois. Évitez d'y appliquer des mises à jour et surtout évitez de supprimer un grand nombre d'enregistrements. Si vous utilisez une table temporaire avec une étendue de transaction, il ne devrait pas être nécessaire de supprimer des enregistrements. Si votre table temporaire a une durée de session et que vous devez l'effacer, il serait préférable d'utiliser TRUNCATE, si possible, plutôt que DELETE.
"Les informations nécessaires pour supprimer les données de votre session de la table temporaire à la fin de la transaction ou de la session" Non, il peut simplement libérer l'espace nécessaire pour l'objet de données. L'UNDO est nécessaire pour annuler les effets d'une seule déclaration si elle échoue à mi-chemin. Il est également nécessaire de prévoir un ROLLBACK TO SAVEPOINT ou un ROLLBACK (bien que pour les TABLES TEMPORAIRES GLOBALES, ce dernier ne soit pertinent que pour les GTT de durée de session) –
@Gary - point équitable. Comme vous pouvez le voir, j'ai beaucoup modifié mon entrée. – APC
Affligé en réponse –