web-dev-qa-db-fra.com

Pourquoi FreeProccaCaché vous permet-il de réduire Tempdb?

Quelqu'un a fait quelque chose de stupide et tempdb a explosé de taille. Les alertes sont en train de tirer parce que le lecteur est plein. J'ai essayé de le rétrécir, et il ne se rétrécirait pas (Même si des requêtes rétrécissantes ont dit qu'ils fonctionnaient).

Il y a beaucoup d'espace libre dans TEMPDB (SQL2014 SP1); TEMPDB> Tâches> Rétrécissement> Fichiers> (Affiche la quantité disponible de l'espace que je puisse libérer)

Je rétrécit (SSMS 2016) pour laisser plus d'espace puis le "minimum de taille". Mais les fichiers ne rétrécissent pas réellement.

Je travaille avec le propriétaire de l'entreprise, je regarde le serveur (sp_whoisactive, etc.) Le serveur est au repos.

La recherche d'une solution me conduit à lorsque vous réduisez TEMPDB ne rétrécira pas (Brentozar.com)

J'exécute ce qui suit et ça marche TEMPDB, est de retour à la taille d'origine.

 DBCC FREEPROCCACHE

 USE [tempdb]
 GO
 DBCC SHRINKFILE (N'tempdev' , 2048)
 GO

Je comprends que DBCC FreeProctaccaCaCaCaCaCaCaCa libère toutes les données de cache et les plans d'impact. Mais si cela prenait de la place dans TEMPDB, il aurait dû montrer l'espace utilisé et non disponible pour une rétrécissement normale.

Pourquoi cela a-t-il travaillé?

Basé sur les commentaires pointant sur ce qui est important, c'est que les objets mis en cache sont liés à un plan de requête et que, en libérant le cache de procédure, vous pouvez éloigner ces objets, vous permettant de réduire vos fichiers. Permettez-moi de me donner une phrase cette question de l'autre sens.

TEMPDB pense qu'il dispose d'espace pour remédier comme étant mis en évidence par "minimum de taille de taille", l'espace qui n'aura plus été créé dans un processus temporaire qui ne fonctionnent plus. Il y a un gros morceau d'espace alloué et inutilisé, pourquoi ne puis-je pas le libérer sans détruire le (s) plan (s) de requête (s)?

Les plans de requête ou le cache ne sont-ils pas vivants sur un espace disque alloué, mais toujours être protégés de la rétrécissement?

analogie: "Rétrécissement minimum de taille" me montre que le verre est à moitié plein/vide mais il n'est pas possible de transférer sur un verre plus petit sans casser le verre et perdre presque tout le contenu.


Quelques années plus tard, la même question sur une instance SQL 2014, moins émergente permet d'essayer expérimenter.

Si vous pouviez en quelque sorte identifier le plan de requête, vous pourrez peut-être supprimer simplement ce plan de libération de la prise sur les pages, puis de la rétrécissement de TEMPDB. Je cherche des moyens d'accomplir cela, mais je n'ai pas encore réussi.

Peut-être que vous pouvez utiliser dbcc Page pour voir ce qui est sur cette page afin que vous puissiez y remédier?

DBCC TRACEON (3604)  -- By default, the output is sent to the errorlog. If you want the output to come back to your current connection, turn on trace flag 3604.
GO
DBCC PAGE ([tempdb], 1, 1, 3); -- detailed dump of the PFS page
GO 

Je vois que la dernière page est 937, alors je vais le regarder.

DBCC PAGE ([tempdb], 1, 937, 3);
GO

Rien clairement un problème là-bas, les dernières pages ont l'air vide.

J'ai essayé la suggestion de Mike Fields (4 février 2016 12:01) tentatives multiples n'a même pas libre de 1 Mo.

J'ai rencontré ce problème hier, à l'aide de la tâche SSMS pour réduire les fichiers n'a jamais été accompli, puis j'ai relu la documentation sur le fichier de rétrécissement et réalisée que je devais essayer ceci:

DBCC SHRINKFILE (N'tempdev' , NOTRUNCATE) -- Move allocated pages from end of file to top of file
DBCC SHRINKFILE (N'tempdev' , 0, TRUNCATEONLY) -- Drop unallocated pages from end of file

Je l'ai fait pour tous les 8 fichiers TEMPDEV et lentement, au fil du temps, il a finalement retrouvé environ 80% de l'espace. Cela a été vraiment surpris de ce que rien d'autre n'avait travaillé. Je devais courir un emploi toutes les 15 minutes à travers la journée mais cela a finalement récupéré l'espace

Sur une instance SQL 2014, j'ai "naturellement" effacé le cache lorsqu'une grande base de données a été reconstruite avec un index de colonne de colonne en cluster (processus nocturne). Le même micrkfile qui ne ferait rien la journée précédente fonctionne comme prévu le matin.

USE [tempdb]
GO
DBCC SHRINKFILE (N'tempdev' , 2000)
GO

Peut-être que si je pouvais recréer le problème sur demande sur une instance de 2016 avec la requête de la requête, il serait plus facile de suivre exactement ce qui se passe?

1
James Jenkins

Cette réponse est basée sur des commentaires sous la question de @MRTCS pointant vers ce lien et par @krisgruttemeyer avec ce résumé

TL; DR - "Ce qui est important, c'est que les objets mis en cache sont liés à un plan de requête et que, en libérant le cache de procédure, vous pouvez éloigner ces objets, vous permettant de rétrécir vos fichiers."

Si je comprends bien:

Ce qui se passe lorsque vous ne pouvez pas rétrécir Tempdb, comme il y a un pointeur ( ou quelque chose ) physiquement situé sur la dernière page (s) de la Datafile . Il pointe du plan de requête qui a provoqué à TEMPDB. Cette page ne sera pas libérée tant que ce plan de requête existe. L'option nucléaire est le fichier libre DBCC, qui efface tous les plans de requête et la page est libérée.

0
James Jenkins