Comment faire pour forcer le garbage collector filestream pour achever ses travaux avec la plus haute priorité?
Après avoir demandé cette question il est clair pour moi que j'ai besoin d'être en mesure d'effectuer la collecte des ordures et le plus rapidement possible.
Comment est-il possible de dire à SQL Server filestream du garbage collector pour supprimer tous les fichiers avec une haute priorité?
J'ai essayé avec le point de contrôle de l'énoncé, même en définissant une durée (point de contrôle 100), mais rien ne change.
Après la suppression de 40000 filestream dossiers, je vois que le garbage collector supprime 4-5 fichiers par seconde. Comment lui dire "de tous les supprimer maintenant"?
OriginalL'auteur LaBracca | 2010-09-06
Vous devez vous connecter pour publier un commentaire.
Malheureusement il n'y a actuellement aucun moyen de forcer un garbage collection (GC) des données filestream. Il est géré par un asynchrones tâche en arrière-plan, qui sera appelée chaque
si souvent, et a une limite dans le nombre de fichiers qu'il peut traiter en un seul appel. D'autres personnes ont déjà plaint à ce sujet et Microsoft a promis de régler ce problème dans les versions futures.
Cela étant dit, il ya certaines choses que vous pouvez de manière proactive faire pour s'assurer que tous les fichiers supprimés sont admissibles pour la collecte des ordures. Un fichier n'est pas automatiquement devenir éligibles pour la collecte des ordures le moment, il est supprimé de la base de données - certaines conditions supplémentaires doivent être remplies.
Les conditions dépendent du mode de récupération de la base de données, par conséquent, il est important que vous sachiez ce modèle de récupération de votre base de données. Notez que même si le modèle de récupération (comme spécifié par sys.les bases de données) est plein, mais vous n'avez pas une db/journal de sauvegarde depuis l'activation du modèle de récupération complète (ou depuis la création de la db), la base de données va se comporter dans de nombreux aspects comme s'il était encore dans le modèle de récupération simple.
En vertu de modèle de récupération simple de tout ce qui est nécessaire pour un fichier pour être admissible à la suppression, c'est que le point de contrôle actuel NUMÉRO (le NUMÉRO du dernier point de contrôle) est plus grand que le NUMÉRO de l'opération de suppression pour supprimer le fichier. Donc tout ce que vous pouvez faire après la suppression de 40 000 lignes est de délivrer un seul point de contrôle de déclaration et d'attendre.
Les choses se compliquent quand la base de données est "réellement" modèle de récupération. Si c'est le cas, alors, en plus de point de contrôle NUMÉRO de sauvegarde NUMÉRO (le NUMÉRO de la dernière sauvegarde de journal) doit être passé la suppression de la LSN. En outre, le GC fonctionne en 2 phases: dans la première étape, il ne marque un fichier pour la suppression, mais ne pas supprimer physiquement. Seulement lorsque GC processess le fichier pour la deuxième fois que le fichier d'obtenir physiquement supprimés à partir du disque. Pour rendre les choses encore plus intéressantes, la première passe de GC "réinitialise" la suppression de la LSN, de sorte que la deuxième passe peut traiter uniquement lorsque le fichier de point de contrôle LSN et de sauvegarde LSN sont plus grand que le NUMÉRO de la première GC passer.
Si vous voulez savoir exactement ce qui se passe dans le système, vous pouvez garder une trace de courant GC progrès en regardant un interne spécial "pierres tombales" de la table. Chaque fois qu'une valeur filestream est supprimé de la base de données, une pierre tombale est inséré dans ce tableau. La pierre tombale est supprimé uniquement après que le fichier a été supprimé à partir du disque. La pierre tombale nom de la table est sys.filestream_tombstone_ où est un nombre. Vous pouvez obtenir le nom exact à l'aide de la requête suivante:
Puisque c'est une table interne, à la requête, il vous suffit de connecter à l'aide du CAD (connexion administrateur dédiée).
Par exemple, disons que j'ai supprimé une ligne avec une seule valeur filestream. Maintenant, je peux voir l'état de la pierre tombale en exécutant la requête suivante (à partir de CAD):
Les 3 premiers champs d'indiquer le NUMÉRO de l'opération de suppression, mais le plus important à observer est l'état. Après l'émission de sauvegarde de journal de + de point de contrôle et le laisser fonctionner pendant quelques secondes, j'ai une requête de base de la table de nouveau et j'obtiens:
Note que la situation a changé (les 2 derniers bits de changer de 1 à 2), ce qui indique que le fichier a été traité par le premier GC passer. En outre, l'ENREGISTREMENT a été mis à jour avec le NUMÉRO de la première GC passer, donc, pour le deuxième GC passer pour être en mesure de finalement supprimer le fichier, nous devons apporter NSE du point de contrôle et de sauvegarde LSN au-dessus du nouveau NUMÉRO. J'question d'un autre point de contrôle + journal de sauvegarde, attendez quelques secondes et re-interroger les pierres tombales de la table. Il est maintenant vide, et le fichier a disparu du disque.
Garder à l'esprit qu'il existe d'autres choses (par exemple, la réplication, les autres transactions lorsque le contrôle de version est activé) qui peuvent empêcher un particulier de fichiers à partir de déchets ramassés, mais dans la plupart des cas de point de contrôle et de sauvegarde de journal sont les 2 principaux.
Oups, je crois que j'ai peut-être allé trop profondément dans les détails, mais peut-être cela va aider d'une certaine manière dans la compréhension du comportement du GC.
A-t-il eu des changements dans les 7 dernières années? Si vous pouvez fournir une mise à jour de la réponse avec la version spécifique de l'information qui serait super génial.
OriginalL'auteur Pawel Marciniak
Apparemment il y a maintenant un moyen, en utilisant
dans SQL Server 2012
OriginalL'auteur Michael Sander
Je n'ai pas un environnement où je peux tester mais avez-vous essayé de basculer en mode de récupération simple?
OriginalL'auteur Joel Mansford