Nous avons une base de données SQL Server 2005, la base de données temporaire est pleine. En allant dans SQL Server Management Studio, je peux voir toutes les tables temporaires dans tempdb. Est-il possible de dire quelle session contient quelle table temporaire? Idéalement, une requête répertoriant les tables temporaires utilisées par chaque session.
Merci,
sql-server
sql-server-2005
tempdb
SQLMIKE
la source
la source
Réponses:
J'ai demandé que quelque chose soit intégré en 2007, sur Connect. Cela a été rejeté pour la version 2008, puis ignoré, jusqu'à ce que Connect meure il y a quelques années. J'ai essayé de le trouver sur le nouveau site de commentaires pour SQL Server , mais cette recherche est un véritable incendie. Le titre de ma demande était "dmv pour mapper la table temporaire vers session_id" - puisque la recherche ne peut faire que OU, "la table temporaire de la carte" renvoie 118 pages de résultats. Google semble suggérer que l'article n'a pas été coupé lorsqu'il a tué Connect .
En attendant, pour SQL Server 2005 et 2008, vous devriez pouvoir extraire ces informations de la trace par défaut:
Sorti sans vergogne de ce billet de blog de Jonathan Kehayias .
Pour déterminer l'utilisation de l'espace, vous pouvez encore améliorer cela pour joindre des données à partir de vues comme
sys.db_db_partition_stats
- par exemple:Le problème ici est d'essayer de corréler un nom de table par le texte de la requête; ce n'est tout simplement pas pratique, car la plupart du temps, l'utilisateur n'exécute toujours pas de requête sur cette table (sans parler de l'exécution de celle qui l'a créée / remplie).
Cependant, et c'est pour les autres lecteurs (ou pour vous lorsque vous effectuez une mise à niveau), la trace par défaut dans 2012+ ne suit plus la création d'objets de table temporaire , si la table #temp est un tas. Je ne sais pas si c'est une coïncidence ou directement liée au fait qu'à partir de 2012, toutes les tables temporaires ont maintenant un négatif
object_id
. Vous pouvez bien sûr passer à Événements étendus pour vous aider à collecter et suivre ces informations, mais cela peut être beaucoup de travail manuel (et j'ai seulement vérifié que ce n'est plus suivi dans la trace - vous ne pourrez peut-être pas les récupérer dans les événements étendus). La trace par défaut sera récupérez les tables #temp créées avec une PK ou une autre contrainte, ou avec des contraintes ou des index ajoutés après l'événement de création, mais vous devrez ensuite assouplir les restrictions temporelles ci-dessus (un index peut être créé bien plus tard que 100 ms après création).Quelques autres réponses sur ce site qui peuvent être utiles:
Comment identifier quelle requête remplit le journal des transactions tempdb?
Les problèmes avec le fichier mdf TempDB ne cessent d'augmenter
Rechercher les transactions qui remplissent le magasin de versions
J'ai également blogué à ce sujet, avec une session d'événements étendus personnalisée pour suivre ces informations dans SQL Server 2012 et versions ultérieures:
Et Paul White a blogué sur la lecture de pages directement (pas exactement pour les faibles de cœur, ni facile à automatiser en aucune façon):
la source
Voici une requête qui devrait vous aider à découvrir les informations que vous recherchez:
Cette requête extrait des informations utiles pour les 10 principales tâches, telles que les pages allouées / désallouées, le texte SQL des tâches (si disponible), etc.
Ces DMV regorgent d'informations, donc si vous avez besoin de plus de données, vous pouvez mélanger et assortir ce que vous tirez. Mais cela devrait être un point de départ pour le dépannage des tâches de consommation tempdb actuelles.
la source
tempdb.sys.dm_db_partition_stats
. Malheureusement, vous ne pouvez pas vraiment dire quelle copie de#some_table_name
appartient à quel utilisateur, et vous ne pourrez pas toujours extraire du texte d'instruction qui fait référence à cette table à un moment donné - ce n'est peut-être pas la requête que l'utilisateur exécute actuellement. Vous voudrez peut-être voir ceci et cela