web-dev-qa-db-fra.com

Paramètres de nettoyage de fantôme

Je gère une base de données transactionnelle élevée (~ 175K transactions/minute en moyenne, presque 9 m d'enregistrements par heure ajoutés et supprimés)

Jusqu'à récemment, cela n'a pas été trop de problème, car nous avons été ajoutés à ~ 7,5 millions d'enregistrements ajoutés et supprimés, mais avec les derniers afflux de données, le nettoyage de Ghost ne semble pas pouvoir suivre le nettoyage de la Espace inutilisé sur les tables/index.

Il y a quelques jours, nous avons atteint 53 Go d'espace inutilisé sur 16 tables (surtout 2 d'entre eux) afin de commencer à regarder dans le processus de nettoyage des fantômes afin de déterminer qu'il fonctionne une fois toutes les 5 secondes et exécute plus de 10 pages.

Ma solution actuelle est que tôt le matin, je passe trois threads de la commande suivante:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

pour rattraper l'arriéré de la nuit précédente (lorsque la plupart de nos suppressions ont lieu)

Je me demande s'il y a un moyen de modifier les paramètres par défaut de 5 secondes et 10 pages à affirmer chaque seconde ou de réaliser plus de 20 pages, y a-t-il un moyen de le faire ou devrais-je continuer à tourner plusieurs Procs de nettoyage pour effacer le données, ou s'il y a d'autres actions pouvant aider avec cela

La ré-indexation fonctionne sur les index les plus efficaces au moins une fois par semaine (la plupart sont tous les jours)

SQL Server 2012 Enterprise SP3_CU8 (mise à niveau vers CU9 demain) sur le cluster de toujours disponible également avec réplication (distribution sur un serveur séparé)

10
Ste Bov

Je me demande s'il y a un moyen de modifier les paramètres par défaut de 5 secondes et 10 pages pour dire chaque seconde ou exécuter plus de 20 pages

Non, il n'y en a pas. Au moins je ne sais pas à partir de maintenant :-)

s'il y a d'autres actions pouvant aider avec ceci

du blog de Paul Randal - Une méthode Les personnes prennent parfois envisagent de forcer le nettoyage des fantômes pour tout nettoyer en effectuant une numérisation de table ou d'index (faisant appel à tous les enregistrements supprimés pour la tâche de nettoyage de Ghost).

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

Y a-t-il une possibilité pour vous de partitionner la table et purger l'ancienne partition au lieu de faire des suppresses ? FYI .. SQL Server 2016 et UP vous permet de tronquer également des partitions individuelles.

En outre, vous pouvez (test et outil) - Désactiver le nettoyage de fantôme (drapeau de trace 661) puis rebuild index WITH ONLINE = ON Option depuis que vous utilisez Enterprise Edition.

Si vous utilisez toujours (avec async) avec réplication, assurez-vous d'activer Drapeau de trace 1448 - permet au lecteur de journal de réplication pour aller de l'avant même si les répliques secondaires asynchrones n'ont pas reconnu la réception d'un changement.

Assurez-vous de lire Supprime ces pages divisées et des fantômes transférés de Paul White pour voir si vos tables ont des déclencheurs ou des colonnes LOB qui ralentissent.

4
Kin Shah