(Questo era originariamente un commento alla risposta di @ DaveE, ma l'ho inserito nella sua risposta perché è diventato lungo)
TRUNCATE
è un'operazione registrata. Deve essere altrimenti non conforme ACID. Tuttavia, le differenze tra TRUNCATE
e DELETE
:
- Utilizzo dello spazio del registro:
TRUNCATE
registra solo le pagine / le estensioni * liberate, mentre DELETE
registra le singole righe.
- Utilizzo dei
TRUNCATE
blocchi : generalmente utilizza meno blocchi, poiché richiede un blocco tabella e blocchi pagina, al contrario dei DELETE
quali utilizza i blocchi riga **.
IDENTITY
sequenze: TRUNCATE
reimposta la sequenza identità su una tabella, se presente.
(* Un'estensione = 8 pagine. TRUNCATE
Registrerà / rimuoverà le estensioni se sono tutte da quella tabella, altrimenti registrerà / rimuoverà le pagine dalle estensioni miste.
** Un effetto collaterale di ciò è che DELETE FROM TABLE
potenzialmente possono lasciare pagine vuote assegnate alla tabella, a seconda che l'operazione possa ottenere o meno un blocco esclusivo della tabella.)
Quindi (tornando alla domanda originale), TRUNCATE TABLE
è decisamente meglio che DELETE FROM TABLE
se si svuota la tabella ma si desidera mantenere la struttura (NB: TRUNCATE
non può essere utilizzato su una tabella a cui fa riferimento una chiave esterna di un'altra tabella).
Come notato nel commento di @ Tullo, controlla anche il modello di recupero del tuo database - se è pieno, allora devi iniziare a fare i backup del log o cambiare il tuo modello di recupero in semplice. Una volta che hai fatto uno di questi, probabilmente vorrai ridurre il tuo file di registro come un'operazione una tantum (NB: solo file di registro ) per recuperare tutto quello spazio libero.
Infine, un'altra cosa da tenere presente: le statistiche delle tabelle. eseguire UPDATE STATISTICS <TABLENAME>' after
TRUNCATE /
DELETE` in modo che l'ottimizzatore della query non venga attivato dalle vecchie statistiche.
TRUNCATE TABLE
anzichéDELETE FROM
.