Utilisation de SQL Server 2005.
J'effectue une énorme DELETE FROM sans clauses Where. C'est fondamentalement équivalent à une instruction TRUNCATE TABLE - sauf que je ne suis pas autorisé à utiliser TRUNCATE. Le problème est que le tableau est énorme - 10 millions de lignes et qu'il faut plus d'une heure pour le terminer. Est-il possible d'accélérer le processus sans:
- Utilisation de tronquer
- Désactiver ou supprimer des index?
Le t-log est déjà sur un disque séparé.
Toutes les suggestions sont les bienvenues!
sql-server
performance
delete
tuseau
la source
la source
Réponses:
Ce que vous pouvez faire, c'est supprimer des lots comme ceci:
Où xxx est, par exemple, 50000
Une modification de ceci, si vous voulez supprimer un pourcentage très élevé de lignes ...
la source
Vous pouvez utiliser la clause TOP pour le faire facilement:
la source
Je suis d'accord avec les suggestions pour regrouper vos suppressions en morceaux gérables si vous ne pouvez pas utiliser TRUNCATE, et j'aime bien la suggestion de déposer / créer pour son originalité, mais je suis curieux du commentaire suivant dans votre question:
Je suppose que la raison de cette restriction est liée à la sécurité à accorder pour tronquer directement une table et au fait qu'elle vous permettrait de tronquer des tables autres que celle qui vous concerne.
En supposant que ce soit le cas, je me demandais si le fait de créer une procédure stockée utilisant TRUNCATE TABLE et utilisant "EXECUTE AS" serait considéré comme une alternative viable à l'attribution des droits de sécurité nécessaires pour tronquer directement la table.
J'espère que cela vous donnera la vitesse dont vous avez besoin, tout en apportant une solution aux problèmes de sécurité que votre société pourrait avoir en ajoutant votre compte au rôle db_ddladmin.
Un autre avantage de l’utilisation d’une procédure stockée de cette manière est que celle-ci peut être verrouillée afin que seuls les comptes spécifiques puissent l’utiliser.
Si, pour une raison quelconque, ce n'est pas une solution acceptable et que vous devez supprimer les données de cette table une fois par jour / heure / etc, je demanderais qu'un travail d'agent SQL ait été créé pour tronquer la table. à une heure programmée chaque jour.
J'espère que cela t'aides!
la source
Sauf tronquer .. seulement supprimer par lots peut vous aider.
Vous pouvez supprimer la table et la recréer, avec toutes les contraintes et tous les index, bien entendu. Dans Management Studio, vous avez la possibilité d’écrire dans un tableau une table à supprimer et à créer. Il s’agit donc d’une option triviale. Mais ceci uniquement si vous êtes autorisé à effectuer des actions DDL, ce qui, à mon avis, n'est pas vraiment une option.
la source
Étant donné que cette question est une référence si importante, je publie ce code qui m'a vraiment aidé à comprendre la suppression avec des boucles ainsi que la messagerie dans une boucle pour suivre les progrès.
La requête est modifiée à partir de cette question en double. Crédit à @RLF pour la base de requêtes.
la source