web-dev-qa-db-fra.com

Le moyen le plus rapide de supprimer toutes les données d'une grande table

J'ai dû supprimer toutes les lignes d'une table de journal qui contenait environ 5 millions de lignes. Mon premier essai a été d'émettre la commande suivante dans l'analyseur de requêtes:

supprimer du client_log

ce qui a pris très longtemps.

44
Ron Skufca

Découvrez tableau tronqué qui est beaucoup plus rapide.

76
Rob Walker

J'ai découvert TRUNCATE TABLE dans la référence msdn transact-SQL. Pour toutes les personnes intéressées voici les remarques:

TRUNCATE TABLE est fonctionnellement identique à l'instruction DELETE sans clause WHERE: les deux suppriment toutes les lignes de la table. Mais TRUNCATE TABLE est plus rapide et utilise moins de ressources système et de journal des transactions que DELETE.

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 désallouant les pages de données utilisées pour stocker les données de la table, et seules les désallocations de page sont enregistrées dans le journal des transactions.

TRUNCATE TABLE supprime toutes les lignes d'une table, mais la structure de la table et ses colonnes, contraintes, index, etc. restent. Le compteur utilisé par une identité pour les nouvelles lignes est réinitialisé à la valeur de départ de la colonne. Si vous souhaitez conserver le compteur d'identité, utilisez plutôt DELETE. Si vous souhaitez supprimer la définition de table et ses données, utilisez l'instruction DROP TABLE.

Vous ne pouvez pas utiliser TRUNCATE TABLE sur une table référencée par une contrainte FOREIGN KEY; à la place, utilisez l'instruction DELETE sans clause WHERE. Étant donné que TRUNCATE TABLE n'est pas enregistré, il ne peut pas activer de déclencheur.

TRUNCATE TABLE ne peut pas être utilisé sur des tables participant à une vue indexée.

33
Ron Skufca

Il existe un mythe commun selon lequel TRUNCATE ignore en quelque sorte le journal des transactions.

Ceci est un malentendu et est clairement mentionné dans MSDN.

Ce mythe est invoqué dans plusieurs commentaires ici. Éradiquons-le ensemble;)

15
squadette

Pour référence TRUNCATE TABLE fonctionne également sur MySQL

6
UnkwnTech

oubliez tronquer et supprimer. conservez vos définitions de table (au cas où vous voudriez la recréer) et utilisez simplement drop table.

3
siculars

J'utilise la méthode suivante pour mettre à zéro les tables, avec le bonus supplémentaire qu'il me laisse avec une copie d'archive de la table.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
3
dar7yl

Sur SQL Server, vous pouvez utiliser le Truncate Table commande qui est plus rapide qu'une suppression régulière et utilise également moins de ressources. Il réinitialisera également tous les champs d'identité à la valeur de départ.

Les inconvénients de truncate sont qu'il ne peut pas être utilisé sur des tables référencées par des clés étrangères et qu'il ne déclenchera aucun déclencheur. De plus, vous ne pourrez pas restaurer les données en cas de problème.

1
Martynnw

truncate table est pas indépendant de la plate-forme SQL. Si vous pensez que vous pourriez jamais changer de fournisseur de base de données, vous pouvez vous méfier de l'utiliser.

1
James A. Rosen

Notez que TRUNCATE réinitialisera également toutes les clés d'incrémentation automatique, si vous les utilisez.

Si vous ne souhaitez pas perdre vos clés d'incrémentation automatique, vous pouvez accélérer la suppression en supprimant par ensembles (par exemple, DELETE FROM table WHERE id> 1 AND id <10000). Cela accélérera considérablement et, dans certains cas, empêchera le verrouillage des données.

1
Brian D.

La suggestion de "Déposer et recréer la table" n'est probablement pas bonne car cela gâche vos clés étrangères.

Vous utilisez des clés étrangères, non?

0
Andy Lester

Oui, eh bien, la suppression de 5 millions de lignes va probablement prendre beaucoup de temps. La seule façon potentiellement plus rapide à laquelle je peux penser serait de supprimer la table et de la recréer. Cela ne fonctionne, bien sûr, que si vous souhaitez supprimer TOUTES les données du tableau.

0
TheSmurf

tronquer la table client_log

est votre meilleur choix, tronquer tue tout le contenu du tableau et des index et réinitialise toutes les graines que vous avez aussi.

0
Ronald Hobbs

Je révise ma déclaration précédente:

Vous devez comprendre qu'en utilisant TRUNCATE, les données seront effacées mais rien ne sera enregistré dans le journal des transactions. L'écriture dans le journal explique pourquoi DELETE prendra indéfiniment 5 millions de lignes. J'utilise TRUNCATE souvent pendant le développement, mais vous devez vous méfier de l'utiliser sur une base de données de production car vous ne pourrez pas annuler vos modifications. Vous devez immédiatement effectuer une sauvegarde complète de la base de données après avoir effectué un TRONCATE pour établir une nouvelle base de restauration.

La déclaration ci-dessus était destinée à vous inciter à être sûr que vous comprenez qu'il y a une différence entre les deux. Malheureusement, il est mal écrit et fait des déclarations non prises en charge car je n'ai pas fait de test moi-même entre les deux. Il est basé sur des déclarations que j'ai entendues de la part d'autres personnes.

De MSDN :

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 désallouant les pages de données utilisées pour stocker les données de la table, et seules les désallocations de page sont enregistrées dans le journal des transactions.

Je voulais juste dire qu'il y a une différence fondamentale entre les deux et parce qu'il y a une différence, il y aura des applications où l'une ou l'autre pourrait être inappropriée.

0
Andy Frieders

Si vous ne pouvez pas utiliser TRUNCATE TABLE en raison de clés étrangères et/ou de déclencheurs, vous pouvez envisager de:

  • supprimer tous les index;
  • faites la SUPPRESSION habituelle;
  • recréer tous les index.

Cela peut accélérer quelque peu la suppression.

0
squadette