Me gustaría saber cómo identificar la consulta exacta o el proceso almacenado que en realidad está llenando el registro de transacciones de la base de datos TEMPDB.
65
Me gustaría saber cómo identificar la consulta exacta o el proceso almacenado que en realidad está llenando el registro de transacciones de la base de datos TEMPDB.
Respuestas:
De http://www.sqlservercentral.com/scripts/tempdb/72007/
EDITAR
Como Martin señaló en un comentario, esto no encontraría transacciones activas que ocupan espacio en tempdb, solo encontrará consultas activas que actualmente utilizan espacio allí (y probablemente los culpables del uso actual del registro). Por lo tanto, podría haber una transacción abierta, pero la consulta real que causa el problema ya no se está ejecutando.
Puede cambiar el
inner join
encendidosys.dm_exec_requests
a aleft outer join
, luego devolverá filas para las sesiones que actualmente no están ejecutando consultas activamente.La consulta que Martin publicó ...
... identificaría correos
session_id
electrónicos con transacciones activas que están ocupando espacio de registro, pero no necesariamente podría determinar la consulta real que causó el problema, ya que si no se está ejecutando ahora no se capturará en la consulta anterior para solicitudes activas Es posible que pueda verificar de manera reactiva la consulta más reciente utilizando,DBCC INPUTBUFFER
pero es posible que no le diga lo que desea escuchar. Puede unirse externamente de manera similar para capturar a aquellos que se ejecutan activamente, por ejemplo:También puede usar el DMV
sys.dm_db_session_space_usage
para ver la utilización general del espacio por sesión (pero, de nuevo, es posible que no obtenga resultados válidos para la consulta; si la consulta no está activa, lo que recupere puede no ser el verdadero culpable).Con todas estas consultas a su disposición, debería poder limitar quién está usando tempdb y cómo, especialmente si las atrapa en el acto.
algunos consejos para minimizar la utilización de tempdb
SORT_IN_TEMPDB
opción si no es necesariaTambién puede considerar que su uso del registro tempdb puede ser causado por procesos internos sobre los que tiene poco o ningún control, por ejemplo, el correo electrónico de la base de datos, las notificaciones de eventos, las notificaciones de consultas y el intermediario de servicios usan tempdb de alguna manera. Puede dejar de usar estas funciones, pero si las está usando no puede dictar cómo y cuándo usan tempdb.
fuente
session_id
aparece con la siguiente consultaSELECT database_transaction_log_bytes_reserved,session_id FROM sys.dm_tran_database_transactions tdt JOIN sys.dm_tran_session_transactions tst ON tdt.transaction_id = tst.transaction_id WHERE database_id = 2
. La consulta que esperaba encontrar fue después de ejecutar lo siguienteBEGIN TRAN CREATE TABLE #T(X CHAR(8000)) INSERT INTO #T SELECT name FROM sys.objects
@@SPID
es . informes para el spid con la transacción abierta para todas las columnas para mí. Me pregunto si necesita consultarlo cuando la solicitud se está ejecutando en lugar de estar inactiva con una transacción abierta.<>
=
dm_db_task_space_usage
0
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/17d9f862-b9ae-42de-ada0-4229f56712dc/tempdb-log-filling-cannot-find-how-or-what?forum=sqldatabaseengine
fuente
Gracias por esta publicación, probablemente la única de su tipo. Mi prueba fue simple, creé una tabla temporal y me aseguré de que aparezca cuando ejecuto cualquiera de las consultas de esta publicación ... solo una o dos realmente tuvieron éxito. Lo corregí para que se uniera al T-SQL, lo optimicé para tiradas más largas y lo hice bastante útil. Avíseme si me perdí algo, pero hasta ahora obtuvo un script automatizado / en bucle. Proporciona una forma de evaluar qué consulta / SPID es el delincuente durante un período de tiempo utilizando la consulta de desviación estándar (STDEV) a continuación.
Esto funciona cada 3 minutos durante 40 veces, es decir, 2 horas. Modifique los parámetros como mejor le parezca.
Hay un filtro WHERE> 50 páginas a continuación que la gente puede desear borrar en caso de que tenga muchas tablas pequeñas. De lo contrario, no captará ese matiz con el siguiente, ya que es ...
¡Disfrutar!
fuente
Desafortunadamente, el registro de tempDB no se puede rastrear directamente hasta los ID de sesión al ver los procesos en ejecución.
Reduzca el archivo de registro tempDB a un punto donde crecerá significativamente de nuevo. Luego, cree un evento extendido para capturar el crecimiento del registro. Una vez que vuelva a crecer, puede expandir el evento extendido y ver el archivo del evento del paquete. Abra el archivo, agregue un filtro de tiempo, filtro de tipo de archivo (no desea que se incluyan los resultados del archivo de datos) y luego agrúpelo por ID de sesión en SSMS. Esto lo ayudará a encontrar al culpable (s) mientras busca identificadores de sesión con la mayor cantidad de grupos. Por supuesto, debe recopilar lo que se está ejecutando en las identificaciones de sesión a través de otro proceso o herramienta. Tal vez alguien sepa cómo obtener la consulta de la columna query_hash y tenga la amabilidad de publicar la solución.
Resultados del evento extendido:
Script para crear el evento extendido:
fuente