SQL Server : différence entre `DELETE`, `TRUNCATE` et `DROP` ?

asked 2 months ago499 viewsfr

1

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 ?

AI diagnosis

AI-generated. Not an answer — the community below confirms or corrects it. Always verify before relying on it.

asked 2 months ago

1 Answer

5
✓
✓ Accepted answer

- 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 (...))).

Sign in to tell others whether this worked.

answered 2 months ago

Sign in and verify your email to post an answer.