Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

SQL Server : DELETE FROM ou TRUNCATE TABLE ?

Ces 2 opérations servent à supprimer des données d'une table, mais elles ont des caractéristiques très différentes qui font que le choix de leur utilisation n'est pas aisé.

TRUNCATE TABLE

Les plus :

  • Très rapide
    • du fait qu'il n'y a pas chargement des données dans le cache, et une journalisation dans réduite (mais il y en une, similaire au DROP TABLE)
  • Peut être intégré dans une transaction
  • Libération de l'espace utilisé par la table
  • Réinitialisation des champs compteurs (identity) (suite à remarque dans les commentaires)...

Les moins :

  • Nécessite des droits importants
    • droit de modification du schéma de la table ALTER TABLE
  • Ne peut s'exécuter sur une table comportant des clefs étrangères même désactivées
  • Ne peut s'exécuter sur une table publiée dans une réplication
  • Ne peut être filtré
    • pas de clause WHERE possible

DELETE FROM

Les plus :

  • Ne nécessite qu'un droit de DELETE sur la table
  • Peut être intégré dans une transaction
  • Peut être filtré via un WHERE et/ou une sous requête
  • Peut être effectuée en cascade sur une clef étrangère

Les moins :

  • Les enregistrements à supprimé sont chargé en cache avant suppression
    • Cela peut avoir un effet extrêmement néfaste si votre serveur ne dispose pas d'assez de mémoire
  • Chaque enregistrement supprimé génère un enregistrement dans le journal de transaction
  • Ne libère pas l'espace de la table libéré par la suppression
    • Sauf à indiquer WITH TABLOCK lors de l'exécution de la commande

Lequel choisir ?

Pour une suppression complète d'une table, la préférence va clairement au TRAUNCATE TABLE si cette table n'est pas liée à d'autres, cette méthode est très rapide et n'impacte pas les ressources du serveur.

Si vous avez besoin de supprimer le contenu d'une très grosse table et que le TRUNCATE TABLE est impossible, essayez d'exécuter le DELETE FROM de la manière indiquée ici : http://blogs.codes-sources.com/christian/archive/2006/12/19/sql-server-2005-am-liorations-de-la-clause-top-et-delete-de-grandes-tables.aspx

Dans tous les autres cas le DELETE FROM est le choix qu'il faudra faire.

Bonne suppression…

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Publié jeudi 22 mai 2008 20:45 par christian

Commentaires

lundi 26 mai 2008 13:24 by guldan

# re: SQL Server : DELETE FROM ou TRUNCATE TABLE ?

le TRUNCATE permet également une réinitialisation de l'identity, ce qui peut être pratique dans certains cas (ou pas...)

lundi 26 mai 2008 17:10 by christian

# re: SQL Server : DELETE FROM ou TRUNCATE TABLE ?

Oui, j'avais un peu zappé çà. Effectivement le champs compteur est réinitialisé lors de l'execution d'un TRUNCATE.

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Sortie de Silverlight 2 et de Flash player 10 par Nix's Blog le il y a 10 heures et 2 minutes

- TCB : Que faire en salle blanche ? par The Mit's Blog le il y a 11 heures et 23 minutes

- Debug : Make Object ID - Comment connaitre l'état d'une variable lorsque celle-ci n'est pas accessible dans le scope courant par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-14-2008, 21:42

- IIS7 : Configuration des handlers pour l'upload de fichier - interdire certains fichiers de s'exécuter | accéder à des fichiers .cs, .aspx par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-14-2008, 19:49

- Microsoft annonce le nom commercial de Windows 7 par Code is poetry le 10-14-2008, 12:07

- [Silverlight] Téléchargez la version finale (et les outils associés) dès maintenant ! par Thomas Lebrun le 10-14-2008, 10:37

- Vilain bug avec IQueryable et la syntaxe yield : System.BadImageFormatException "An attempt was made to load a program with an incorrect format. (Exce... par Matthieu MEZIL le 10-14-2008, 07:48

- SQL Server 2008 : Un livre en cours de préparation ! par SQL Server vu par Christian Robert le 10-13-2008, 22:56

- IIS7 : à quel pool d'application correspond le processus w3wp.exe par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-13-2008, 21:59

- PDC 2008 - J-14 ! par Nix's Blog le 10-13-2008, 20:14