web-dev-qa-db-fra.com

Avantages et inconvénients de TRUNCATE vs DELETE FROM

Quelqu'un pourrait-il me donner un bref aperçu des avantages et des inconvénients de l’utilisation des deux affirmations suivantes:

TRUNCATE TABLE dbo.MyTable

contre

DELETE FROM dbo.MyTable

Il semble qu'ils fassent la même chose quand tout est dit et fait; mais il doit y avoir des différences entre les deux.

59
Jim B

TRUNCATE ne génère aucune donnée de restauration, ce qui le rend extrêmement rapide. Il désalloue simplement les pages de données utilisées par la table.

Toutefois, si vous êtes dans une transaction et que vous souhaitez avoir la possibilité "d'annuler" cette suppression, vous devez utiliser DELETE FROM, ce qui permet de revenir en arrière.

EDIT: Notez que ce qui précède est incorrect pour SQL Server (mais cela s'applique à Oracle). Dans SQL Server, il est possible d'annuler une opération de tronquage si vous vous trouvez dans une transaction et que celle-ci n'a pas été validée. Du point de vue de SQL Server, une différence essentielle entre DELETE FROM et TRUNCATE est this : "L'instruction DELETE supprime les lignes une par une et enregistre une entrée dans le journal des transactions pour chaque ligne supprimée. TRUNCATE TABLE supprime les données en libérant les pages de données utilisées pour stocker les données de la table et enregistre uniquement les désallocations de pages dans le journal des transactions. "

En d'autres termes, il y a moins de journalisation pendant un TRUNCATE car seules les désallocations de pages sont enregistrées dans le journal des transactions, alors qu'avec un effacement DELETE DE chaque ligne, la suppression est enregistrée. C'est l'une des raisons pour lesquelles TRUNCATE est extrêmement rapide.

Notez également que pour ce lien MSDN, vous ne pouvez pas tronquer les tables référencées par des contraintes de clé étrangère, participer à une vue indexée ou être publiées à l'aide de la réplication transactionnelle ou de la réplication de fusion.

EDIT 2: Un autre point important est que TRUNCATE TABLE réinitialisera votre identité à la valeur de départ, tandis que DELETE FROM poursuivra son incrément à partir de là où il s'était laissé .. .. Référence: réponse de Ben Robinson.

80
dcp

Un autre point clé non mentionné dans les autres réponses est que TRUNCATE TABLE va réinitialiser votre identité à la graine initiale , alors que DELETE FROM continuera d’augmenter de là où il s’est arrêté.

46
Ben Robinson

Une autre différence du point de vue de la sécurité est que TRUNCATE requiert les privilèges ALTER sur la table, tandis que DELETE nécessite simplement des autorisations (roulement) DELETE sur cette table. 

8
Kyle Hale

TRUNCATE TABLE n'enregistre pas la transaction. Cela signifie qu'il est ultra-rapide pour les grandes tables. L'inconvénient est que vous ne pouvez pas annuler l'opération.

DELETE FROM enregistre chaque ligne supprimée dans les journaux de transactions afin que l'opération prenne un certain temps et entraîne une croissance considérable de vos journaux de transactions. L'avantage est que vous pouvez annuler l'opération si besoin est.

4
Justin Niessner

Contour de Vs Supprimer tronqué dans SQL Server 

Pour Complete Article take après cette connexion: Delete Vs Truncate dans SQL Server

 enter image description here

/*Truncate - Syntax*/
TRUNCATE TABLE table_name

/*Delete - Syntax*/
DELETE FROM table_name
WHERE some_condition
3
Rahul Modi

Je crois que Supprimer et tronquer ne peuvent être annulés que si l'opération a été exécutée dans une transaction explicite. Sinon, vous devrez effectuer une restauration pour récupérer les données supprimées

2
CNkatcher

La différence fondamentale réside dans la façon dont ils sont enregistrés. DELETE et TRUNCATE sont consignés différemment, mais les deux peuvent être restaurés de la même manière. Toutes les opérations qui modifient les données sont enregistrées. Dans SQL Server, une opération non journalisée n'existe pas.

1
nvogel

Plus toutes les réponses, un autre point à considérer: Truncate ne déclenchera pas le delete trigger de la table, mais l'instruction delete déclenchera le delete trigger de la table pour chaque ligne.

0
Melad Ezzat

Une chose très importante (imo) et non mentionnée dans les autres réponses est que TRUNCATE a besoin du verrou de stabilité du schéma, Sch-S, alors que DELETE utilise des verrous de ligne. Permet d'inspecter les éléments suivants:

BEGIN TRANSACTION;

BEGIN TRY
    -- Truncate below will take LCK_M_SCH_S lock for TABLE_A
    TRUNCATE TABLE TABLE_A

    -- Lets say the query below takes 5 hours to execute
    INSERT INTO
        TABLE_A
    SELECT
        *
    FROM
        GIANT_TABLE (NOLOCK)
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    THROW
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;

Supposons maintenant qu’après 1 à 2 minutes après le début de cette requête, supposons que nous ayons essayé d’exécuter ce qui suit:

SELECT COUNT(*) FROM TABLE_A (NOLOCK)

Notez que j'ai utilisé la clause NOLOCK. Que pensez-vous qu'il va se passer maintenant? Cette requête attendra 5 heures. Pourquoi? Parce que la clause NOLOCK a besoin de Sch-S lock sur TABLE_A mais que la clause TRUNCATE a déjà Sch-S. Comme nous n'avons pas encore validé la transaction, le verrou est toujours activé même après la clause TRUNCATE. Sch-S verrouiller sur une table signifie fondamentalement que soit TABLE_A est modifié en ajoutant/supprimant des colonnes, etc., soit en étant tronqué. Vous ne pouvez même pas exécuter quelque chose comme ci-dessous:

SELECT object_id('TABLE_A')

Cela sera bloqué 5 heures aussi. Cependant, si vous remplacez cette TRUNCATE par DELETE FROM, vous constaterez qu'il n'y aura pas de verrou Sch-S sur la table et que les requêtes ci-dessus ne seront pas bloquées.

0
sotn

Une autre différence entre DELETE et TRUNCATE est le comportement lorsque la table est corrompue.

Par exemple:

DELETE FROM table_name;

Va se retrouver avec une erreur:

Msg 3314, Niveau 21, Etat 3, Ligne 1

Lors de l'annulation d'une opération enregistrée dans la base de données '...', une erreur s'est produite au niveau de l'ID d'enregistrement de journal (). Généralement, l'échec spécifique est consigné précédemment sous forme d'erreur dans le service Journal des événements Windows. Restaurez la base de données ou le fichier à partir d'une sauvegarde ou réparez la base de données.

Msg 0, niveau 20, état 0, ligne 0

Une erreur grave s'est produite sur la commande actuelle. Les résultats, le cas échéant, doivent être jetés.

Alors que TRUNCATE fonctionnera:

TRUNCATE TABLE table_name;
-- Command(s) completed successfully.
0
Lukasz Szozda