SQL Server : différence entre `DELETE`, `TRUNCATE` et `DROP` ?
posée 2 months ago500 vuesfr
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 ?
Diagnostic IA
Généré par IA. Ce n'est pas une réponse — la communauté ci-dessous le confirme ou le corrige. Vérifiez toujours avant de vous y fier.
1 réponse
- 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 (...))).
Connectez-vous pour dire si ça a marché.
Sign in and verify your email to post an answer.