Tenemos una base de datos SQL Server 2005, la base de datos temporal se ha llenado. Al ingresar a SQL Server Management Studio puedo ver todas las tablas temporales en tempdb. ¿Es posible saber qué sesión tiene qué tabla temporal? Idealmente, una consulta que enumeraría las tablas temporales utilizadas por cada sesión.
Gracias,
sql-server
sql-server-2005
tempdb
SQLMIKE
fuente
fuente
Respuestas:
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:
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: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 negativo
object_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:
¿Cómo identificar qué consulta está llenando el registro de transacciones tempdb?
Problemas con el archivo mdf TempDB cada vez mayor
Encuentra transacciones que llenan la tienda de versiones
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):
fuente
Aquí hay una consulta que debería ayudarlo a encontrar la información que está buscando:
Esta consulta extrae información útil para las 10 tareas principales, como las páginas asignadas / desasignadas, el texto SQL de las tareas (si está disponible), etc.
Estos DMV están llenos de gran información, por lo que si necesita más datos, puede mezclar y combinar con lo que está obteniendo. Pero este debería ser un punto de partida para solucionar las tareas actuales de consumo de tempdb.
fuente
tempdb.sys.dm_db_partition_stats
. Desafortunadamente, realmente no puede saber qué copia#some_table_name
pertenece a qué usuario, ni siempre podrá extraer el texto de la declaración que haga referencia a esa tabla en un momento dado; esa puede no ser la consulta que el usuario está ejecutando actualmente. Es posible que desee ver esto y esto