TRUNCATE

L'istruzione TRUNCATE è un comando DDL che opera a livello di Data Dictionary e impatta sulla struttura della tabella e non il suo contenuto anche se come effetto ha quello di eliminare i dati.
Attenzione vengono troncati anche gli Indici associati alla tabella.
Dopo il comando Truncate non è possibile né eseguire Rollback né l'istruzione FlashBack Table perché i dati non vengono conservati nell' Undo Datafile.
Non è possibile troncare una tabella se contiene una colonna referenziata da una foreign key constraint in un altra tabella.  Occorre prima disabilitare la foreign key.

S i n t a s s i
TRUNCATE TABLE <table_name>;

Quando viene creata una tabella viene allocato un Extent nei data files e quando vengono eseguite le insert l'extent viene riempito. Una volta pieno, vengono allocati nuovi extent per la suddetta tabella.
Tutti gli extent appartenenti alla stessa tabella definiscono un Segment.
Nel Data Dictionary oltre ad essere tracciato l'allocazione degli extent è tracciato lo spazio usato rispetto a quello allocato, tramite il parametro HIGH WATER MARK.
Questo parametro indica l'ultima posizione nell'ultimo extent usato: lo spazio al di sopra di HWM è libero, al di sotto è occupato.
Una ulteriore INSERT sposta verso l'alto il parametro HWM.
Una DELETE invece svuota i blocchi sotto HWM ma il parametro non è modificato finché la tabella non viene troncata. Lo spazio al di sotto di HWM rimane assegnato alla tabella.
L'istruzione TRUNCATE invece resetta il parametro HWM spostandolo all'inizio del primo extent della tabella. Di conseguenza Oracle assume che non ci sono righe sopra HWM e quindi rimuove tutte le righe dalla tabella. Per questo motivo la TRUNCATE è più veloce della DELETE.



Il parametro HWM ha impatti sulle performance perché Oracle analizza tutti i blocchi di una tabella sotto HWM.
Supponiamo di avere una tabella di 1000 righe e di effettuare una DELETE e successivamente di eseguire il comando SELECT COUNT(*).
Verrà impiegato del tempo per leggere tutti i blocchi sotto HWM anche se vuoti, rispetto ad una TRUNCATE  che resetta HWM e quindi non ci sono più blocchi occupati.

Per eseguire il comando TRUNCATE TABLE occorre essere l'owner della tabella o avere i privilegi di sistema DELETE ANY TABLE.


Post popolari in questo blog

Create e Drop Pluggable Database

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione