Verwijder alle rijen in tabel

Normaal zou ik een delete * from XXXdoen, maar in deze tabel is dat erg traag, het heeft normaal ongeveer 500k tot 1m rijen erin (een is een varbinary (MAX) als dat van belang is).

Ik vraag me eigenlijk af of er een snelle manier is om de tabel met alle inhoud leeg te maken, het is eigenlijk sneller om het te laten vallen en opnieuw te maken dan om de inhoud te verwijderen via de delete sql-instructie

De reden dat ik de tabel niet opnieuw wil maken is omdat deze intensief wordt gebruikt en verwijderen/hercreëren zal naar ik aanneem indexen en statistieken die door de sql-server zijn verzameld, vernietigen

Ik hoop ook dat er een manier is om dit te doen, want er is een “slimme” manier om het aantal rijen te krijgen via sys.sysindexes , dus ik hoop dat er een even slimme manier is om inhoud te verwijderen


Antwoord 1, autoriteit 100%

TRUNCATE TABLEis sneller dan delete * from XXX. Deleteis traag omdat het rij voor rij werkt. Er zijn een paar situaties waarin truncate niet werkt, waarover u meer kunt lezen op MSDN.


Antwoord 2, autoriteit 31%

Zoals anderen al hebben gezegd, is TRUNCATE TABLEveel sneller, maar er zijn wel enkele beperkingen (overgenomen van hier):

U kunt TRUNCATE TABLE niet gebruiken voor tabellen die:

– Er wordt naar verwezen door een FOREIGN KEY-beperking. (U kunt een tabel afkappen die een externe sleutel heeft die naar zichzelf verwijst.)
– Neem deel aan een geïndexeerde weergave.
– Worden gepubliceerd met behulp van transactionele replicatie of merge-replicatie.

Gebruik in plaats daarvan de instructie DELETE voor tabellen met een of meer van deze kenmerken.

Het grootste nadeel is dat als de tabel die u probeert leeg te maken externe sleutels heeft die ernaar verwijzen, de truncatie-aanroep zal mislukken.


Antwoord 3, autoriteit 15%

U kunt de betreffende tabel hernoemen, een tabel maken met een identiek schema en vervolgens de originele tabel op uw gemak verwijderen.

Zie de MySQL 5.1 Reference Manual voor de [RENAME TABLE][1] en [CREATE TABLE][2] commando’s.

RENAME TABLE tbl TO tbl_old;
CREATE TABLE tbl LIKE tbl_old;
DROP TABLE tbl_old; -- at your leisure

Deze aanpak kan de downtime van applicaties helpen minimaliseren.


Antwoord 4, autoriteit 14%

Ik raad aan om TRUNCATE TABLE te gebruiken, het is sneller en verbruikt minder middelen dan VERWIJDEREN VAN xxx

Hier is het gerelateerde MSDN-artikel


Antwoord 5, autoriteit 6%

Truncate in MS Sql Server

Truncate in Mysql

Other episodes