SQL Server : différence entre `DELETE`, `TRUNCATE` et `DROP` ?
poze 2 months ago496 gadefr
Je veux vider une table de logs de 20 millions de lignes. DELETE FROM logs prend une éternité et remplit le journal de transactions. Que faire ?
Dyagnostik IA
Se IA ki fè l. Se pa yon repons — kominote a anba a konfime oswa korije l. Toujou verifye anvan ou fye l.
1 Repons
- DELETE : supprime ligne par ligne. Chaque ligne est journalisée, les triggers se déclenchent, et on peut filtrer avec WHERE. C'est lent sur de gros volumes. - TRUNCATE TABLE : désalloue les pages de données. C'est quasi instantané et très peu journalisé. Pas de WHERE, pas de triggers, et l'IDENTITY est réinitialisé. Impossible si une clé étrangère référence la table. - DROP TABLE : supprime la table elle-même, structure comprise.
Pour vider complètement la table : TRUNCATE TABLE logs;.
Pour supprimer une partie (ex. logs de plus de 90 jours) sans bloquer ni saturer le journal, procède par lots :
WHILE 1 = 1
BEGIN
DELETE TOP (10000) FROM logs WHERE created_at < DATEADD(day, -90, SYSUTCDATETIME());
IF @@ROWCOUNT = 0 BREAK;
END
À long terme, le partitionnement par date permet de supprimer une période entière instantanément (TRUNCATE ... WITH (PARTITIONS (...))).
Konekte pou di lòt moun si li te mache.
Sign in and verify your email to post an answer.