J'ai plusieurs tables avec une quantité de lignes entre 5M et 1,5G
Chaque table a son champ BLOB, dont la taille varie de 100 octets à 30 Mo et qui est stocké en tant que «types de grande valeur hors ligne» = ON
Les tables sont stockées dans différents groupes de fichiers avec 3-4 fichiers chacun sur un disque différent @ différents LUN @ SAN très rapide
Chaque jour, ces tables grandissent pour une taille de 5 à 100 Go et avec des rangées de 600 000 à 1,5 million de lignes
Après un certain laps de temps , qui varie de 2 semaines à 6 mois, certaines des lignes sont supprimées ou déplacées vers la base de données d'archivage, donc - il n'y a aucune ligne dans les tables de travail datant de plus de 6 mois.
Configuration actuelle du serveur:
- Le moteur du serveur SQL est 2008 R2 SP1 Enterprise @ 24 cœurs, @ 64 Go de RAM
- SQL Server s'exécute avec des indicateurs de démarrage supplémentaires:
-T 3640; (Élimine l'envoi de messages DONE_IN_PROC au client pour chaque instruction dans la procédure stockée. Ceci est similaire au paramètre de session de SET NOCOUNT ON, mais lorsqu'il est défini comme indicateur de trace, chaque session client est traitée de cette façon)
-T 1118; (Commute les allocations dans tempDB de 1pg à la fois (pour les 8 premières pages) dans une certaine mesure.)
-T 2301; (permet des optimisations avancées spécifiques aux requêtes d'aide à la décision. Cette option s'applique au traitement d'aide à la décision de grands ensembles de données)
-T 1117; (agrandit tous les fichiers de données à la fois, sinon cela se passe à tour de rôle.)
-E; (Augmente le nombre d'extensions allouées à chaque fichier d'un groupe de fichiers. Cette option peut être utile pour les applications d'entrepôt de données qui ont un nombre limité d'utilisateurs exécutant des analyses d'index ou de données)
-T 834; (Oblige SQL Server à utiliser des allocations Windows pour les pages volumineuses pour la mémoire allouée au pool de mémoire tampon, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )
- SQL Server utilise de grandes extensions de page
- SQL Server utilise l' option d' initialisation rapide des fichiers
- AUTOSHRINK est désactivé pour toutes les bases de données
Le problème est que, à partir d'un certain point de disponibilité du serveur (de quelques jours à plusieurs mois), le GHOST CLEANUP
processus refuse d'effectuer des nettoyages forcés et de simplement faire son travail habituel - nettoie plusieurs pages en quelques secondes ( which is seen thru Extended Events
), ce qui n'est pas approprié , car il n'est pas en mesure de nettoyer toutes les lignes supprimées
Le problème persiste depuis l'époque de SQL Server 2005 RTM Enterprise
Comment j'ai essayé de résoudre le problème:
- J'ai essayé de forcer les opérations de numérisation sur les index cluster des tables
- J'ai essayé de forcer les opérations de numérisation, ce qui implique tout le contenu de la colonne BLOB sur les index cluster des tables
- système sp_clean_db_free_space & sp_clean_db_file_free_space
- dbcc cleanpage manuellement (@dbid, @fileid, @page) pour tous les fichiers et pages de la base de données
- reconstructions d'index cluster et réorganisation
- recréer la base de données
DBCC FORCEGHOSTCLEANUP
Lorsque j'exécute la requête:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
Je vois des millions et des dizaines de millions d'enregistrements fantômes, mais uniquement pour le type d'unité d'allocation de LOB_DATA
Les seules choses qui aident:
- arrêter le serveur avec la commande SHUTDOWN ou redémarrer l'hôte entier - cela aide, après le redémarrage, le processus GHOST CLEANUP s'exécute quelques heures et nettoie en fait tous les enregistrements fantômes
- DBCC SHRINKFILE avec l'option EMPTYFILE - le déplacement de toutes les données d'un fichier vers un autre fichier ou des fichiers nouvellement créés nettoie les enregistrements fantômes dans ce fichier uniquement - le problème est que je déteste vraiment les opérations de réduction. Et cela prend 3-4 jours pour UN fichier
la question - existe-t-il un moyen de programmation (préférable) ou de maintenance pour forcer GHOST CLEANUP sans interruption du serveur, car le temps d'arrêt du serveur coûte trop cher, voire inacceptable - c'est de milliers à des dizaines de milliers de dollars par heure
Des problèmes ont été remarqués comme les miens:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
Et c'est pareil ici: