Améliorez la vitesse de suppression pour SQL Server

12

Nous avons une énorme base de données de production, sa taille est d'environ 300 Go. Existe-t-il une approche pour améliorer les performances d'une requête de suppression? À l'heure actuelle, la vitesse de suppression est comprise entre 1 et 10 000 par minute, c'est très lent pour nous.

Communauté
la source
2
1000 lignes par minute semblent extrêmement lentes. Êtes-vous confronté à un blocage? Ou est-il aussi lent de sélectionner les lignes, ce qui suggère un besoin d'index?
James Z
Vous devez probablement créer un index pour couvrir vos critères de suppression.
Ginden
6
Il n'y a pas assez de détails pour répondre. Quelle requête exécutez-vous? Avez-vous des index sur les colonnes de critères impliquées (le cas échéant)? Avez-vous des déclencheurs à supprimer? ...
Sébastien Sevrin
3
Essayez-vous de supprimer un milliard de lignes à la fois? Est-il possible que vous attendiez la croissance automatique après la croissance automatique après la croissance automatique? (Il est plus que probable que ce soit l'activité de journal que vous attendez, pas l'activité de suppression réelle.) Voir cet article ...
Aaron Bertrand
3
Aussi. Des contraintes de clé étrangère? Veuillez fournir la définition complète de la table, la requête et le plan d'exécution.
Martin Smith

Réponses:

20

Si vous essayez de supprimer un grand nombre de lignes dans une seule instruction, il est probable que vous attendiez l'activité du journal. Afin que vous puissiez:

  1. Assurez-vous que votre journal est correctement dimensionné afin que les événements de croissance ne vous ralentissent pas. Avec les valeurs par défaut, votre journal démarre probablement à 1 Mo avec une croissance de 10%. Les événements de croissance coûtent cher, et si vous enregistrez même 10 Go de suppressions, cela détruira les performances non seulement maintenant mais aussi à l'avenir (en raison de ce que cela fait pour les VLF).
  2. Si vous supprimez la table entière, utilisez TRUNCATEou DROP/ CREATE.
  3. Si vous supprimez la plus grande partie du tableau, utilisez SELECT INTOpour placer les données que vous souhaitez conserver dans un autre tableau, puis TRUNCATE, reculez la petite partie. (Ou supprimez simplement l'ancienne table, renommez la nouvelle et réappliquez les contraintes / autorisations, etc.)
  4. Minimisez l'impact de la journalisation en premier lieu en supprimant les données en morceaux plutôt qu'en une seule fois. Consultez cet article . Vous pouvez également envisager de passer temporairement à une récupération simple, de sorte que vous n'ayez qu'à CHECKPOINTeffacer le journal au lieu de prendre des sauvegardes de journal, mais vous devez être sûr de le réinitialiser et de prendre une nouvelle sauvegarde complète pour relancer la chaîne de journaux .
Aaron Bertrand
la source
+1, de ma part pour un excellent article. Cela m'a aidé dans le passé à faire comprendre à nos développeurs l'opération de suppression lorsqu'ils ne cessent de nous contacter pour la lenteur et la croissance du fichier journal.
KASQLDBA
De plus, s'il existe des index inutiles, leur suppression augmentera la vitesse de suppression. Encore une fois, si vous supprimez toutes ou presque toutes les données, supprimer tous les index en premier et les recréer ensuite peut avoir un bon impact.
Tony Hinkle
3
@Tony supprimant l'index doit également être enregistré (tout comme le crée), il peut donc simplement s'agir du moment où vous souhaitez payer ce coût. Sans test, je ne suis pas convaincu qu'il y ait un énorme avantage pour le scénario de suppression (comme il y en aurait pour l'insertion / la mise à jour), sauf si vous avez des index que vous n'allez pas conserver par la suite.
Aaron Bertrand
La désactivation temporaire des contraintes FK peut-elle améliorer la requête?
Lev Z
3

Il y a un indice, mais quelle version utilisez-vous? S'agit-il d'une édition entreprise? En tous cas:

  1. Si vous le pouvez, déplacez le journal des transactions sur un disque plus rapide
  2. Analysez . Utilisera-t-il un index pour identifier les enregistrements à supprimer? Sinon, pouvez-vous ajouter un index?
  3. Avez-vous un index sur la table que vous pouvez supprimer? Si oui, laissez-les tomber.
  4. Avez-vous des clés étrangères par rapport à cette table? Cela peut vraiment ralentir votre suppression.
  5. Si vous avez une édition d'entreprise et que le goulot d'étranglement est le disque IO, une compression au niveau de la ligne, peut vous aider un peu (ou pas, selon vos données)
  6. Pouvez-vous partitionner la table? Les index locaux et la suppression des partitions peuvent être plus rapides.
  7. Recherchez où se trouve le goulot d'étranglement via le moniteur d'activité.

Ajoutez des détails, lorsque vous travaillez avec une grande base de données, il n'y a pas une seule réponse valide.

user_0
la source
0

Vous devriez essayer de les supprimer morceau par morceau, probablement en supprimant en boucle, chaque itération de suppression est sa propre transaction, puis en effaçant le journal à la fin de chaque itération de boucle.

En outre, vous devrez trouver le nombre que vous allez utiliser comme valeur dans le bloc pour supprimer les enregistrements. Cela nécessite un test approfondi, ce serait mieux si vous pouvez d'abord tester la valeur de bloc dans UAT.

Sur la façon de procéder, vous renvoie à Briser les opérations de suppression de grande taille en morceaux

KASQLDBA
la source
0

la suppression peut être lente si la grande table a une clé étrangère récursive.

si c'est le cas, trouvez le moment opportun, désactivez les services dépendants, désactivez la clé étrangère récursive, effectuez une suppression massive, puis restaurez la clé étrangère.

obratim
la source
c'était exactement mon cas. Il est un peu risqué de désactiver la contraint, mais la suppression est passée de 1 ligne / seocnd à 500 / seconde
Jurion
0

Ajout de quelques points supplémentaires ...

  1. Essayez de vérifier si le prédicat contient un index et consultez également les statistiques.
  2. Si vous supprimez un grand nombre de lignes et que vous ne souhaitez pas non plus l'option de table temporaire. Optez pour l' tablockoption.
  3. Vérifiez si vous avez des déclencheurs, en particulier après la suppression des déclencheurs.

Pour obtenir plus d'aide, publiez la requête que vous utilisez, les informations sur la table et toutes les informations de blocage.

TheGameiswar
la source