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

posée 2 months ago500 vuesfr

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 ?

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.

posée 2 months ago

1 réponse

5
✓
✓ Réponse acceptée

- 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é.

answered 2 months ago

Sign in and verify your email to post an answer.