(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 TRUNCATEe DELETE:
- Utilizzo dello spazio del registro:
TRUNCATEregistra solo le pagine / le estensioni * liberate, mentre DELETEregistra le singole righe.
- Utilizzo dei
TRUNCATEblocchi : generalmente utilizza meno blocchi, poiché richiede un blocco tabella e blocchi pagina, al contrario dei DELETEquali utilizza i blocchi riga **.
IDENTITYsequenze: TRUNCATEreimposta la sequenza identità su una tabella, se presente.
(* Un'estensione = 8 pagine. TRUNCATERegistrerà / 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 TABLEpotenzialmente 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 TABLEse si svuota la tabella ma si desidera mantenere la struttura (NB: TRUNCATEnon 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>' afterTRUNCATE /DELETE` in modo che l'ottimizzatore della query non venga attivato dalle vecchie statistiche.
TRUNCATE TABLEanzichéDELETE FROM.