web-dev-qa-db-fra.com

Améliorez la vitesse de suppression pour SQL Server

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.

12
User

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 sont coûteux, 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 TRUNCATE ou DROP/CREATE.
  3. Si vous supprimez la plupart du tableau, utilisez SELECT INTO pour placer les données que vous souhaitez conserver dans une autre table, puis TRUNCATE, puis 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. Voir cet article . Vous pouvez également envisager de passer temporairement à la récupération simple, de sorte que vous n'avez qu'à CHECKPOINT pour effacer 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 relancez la chaîne de journaux.
20
Aaron Bertrand

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 le . 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.

3
user_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 du bloc dans UAT.

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

0
KASQLDBA

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'option tablock.
  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 de la table et toutes les informations de blocage.

0
TheGameiswar

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.

0
obratim