Pedí que se construyera algo en 2007, en Connect. Esto fue rechazado para el lanzamiento de 2008, y posteriormente ignorado, hasta que Connect murió hace unos años. Traté de encontrarlo en el nuevo sitio de comentarios para SQL Server , pero esa búsqueda es un incendio absoluto en el contenedor. El título de mi solicitud era "dmv para asignar la tabla temporal a session_id", ya que la búsqueda solo puede hacer OR, "asignar tabla temporal" devuelve 118 páginas de resultados. Google parece sugerir que el elemento no hizo el corte cuando mataron a Connect .
Mientras tanto, para SQL Server 2005 y 2008, debería poder extraer esta información de la traza predeterminada:
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)
Descaradamente sacado de esta publicación de blog de Jonathan Kehayias .
Para determinar el uso del espacio, puede mejorar esto para unir datos de vistas como sys.db_db_partition_stats
, por ejemplo:
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)
El problema aquí es intentar correlacionar un nombre de tabla por texto de consulta; esto simplemente no es práctico, ya que la mayoría de las veces, el usuario todavía no ejecuta una consulta en esa tabla (no importa seguir ejecutando la que la creó / completó).
Sin embargo, y esto es para otros lectores (o para usted cuando actualiza), el rastreo predeterminado en 2012+ ya no rastrea la creación de objetos de la tabla temporal , si la tabla #temp es un montón. No estoy seguro si eso es una coincidencia o está directamente relacionado con el hecho de que a partir de 2012 todas las tablas temporales ahora tienen un resultado negativoobject_id
. Por supuesto, podría pasar a Eventos extendidos para ayudarlo a recopilar y rastrear esta información, pero eso es posiblemente una gran cantidad de trabajo manual (y solo he verificado que esto ya no se rastrea en el rastreo; es posible que no pueda recogerlo arriba en eventos extendidos tampoco). La traza predeterminada será seleccione las tablas de #temp creadas con una PK u otra restricción, o con restricciones o índices agregados después del evento de creación, pero luego deberá aflojar las restricciones basadas en el tiempo anteriores (se puede crear un índice mucho más tarde que 100ms después creación).
Algunas otras respuestas en este sitio que pueden ser útiles:
También escribí un blog sobre esto, con una sesión personalizada de eventos extendidos para rastrear esta información en SQL Server 2012 y versiones posteriores:
Y Paul White ha blogueado sobre leer páginas directamente (no exactamente para los débiles de corazón, ni fácil de automatizar de ninguna manera):