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:
DECLARE @FileName VARCHAR(MAX)
SELECT @FileName = SUBSTRING(path, 0,
LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'
FROM sys.traces
WHERE is_default = 1;
SELECT
o.name,
o.OBJECT_ID,
o.create_date,
gt.NTUserName,
gt.HostName,
gt.SPID,
gt.DatabaseName,
gt.TEXTData
FROM sys.fn_trace_gettable( @FileName, DEFAULT ) AS gt
JOIN tempdb.sys.objects AS o
ON gt.ObjectID = o.OBJECT_ID
WHERE gt.DatabaseID = 2
AND gt.EventClass = 46 -- (Object:Created Event from sys.trace_events)
AND o.create_date >= DATEADD(ms, -100, gt.StartTime)
AND o.create_date <= DATEADD(ms, 100, gt.StartTime)
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:
DECLARE @FileName VARCHAR(MAX)
SELECT @FileName = SUBSTRING(path, 0,
LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'
FROM sys.traces
WHERE is_default = 1;
SELECT
o.name,
o.OBJECT_ID,
o.create_date,
gt.NTUserName,
gt.HostName,
gt.SPID,
gt.DatabaseName,
gt.TEXTData,
row_count = x.rc,
used_page_count = x.upc
FROM sys.fn_trace_gettable( @FileName, DEFAULT ) AS gt
JOIN tempdb.sys.objects AS o
ON gt.ObjectID = o.OBJECT_ID
INNER JOIN
(
SELECT [object_id], SUM(row_count), SUM(used_page_count)
FROM tempdb.sys.dm_db_partition_stats
WHERE index_id IN (0,1)
GROUP BY [object_id]
) AS x(id, rc, upc)
ON x.id = o.[object_id]
WHERE gt.DatabaseID = 2
AND gt.EventClass = 46 -- (Object:Created Event from sys.trace_events)
AND o.create_date >= DATEADD(ms, -100, gt.StartTime)
AND o.create_date <= DATEADD(ms, 100, gt.StartTime)
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égatifobject_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:
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):