Tengo una declaración SQL de mi aplicación. Me gustaría saber qué bloqueos adquiere esa declaración; ¿cómo puedo hacer eso con el servidor SQL? La declaración ha estado involucrada en un punto muerto, que estoy tratando de analizar; No puedo reproducir el punto muerto. Estoy ejecutando en MS SQL Server 2005.¿Qué cerraduras se adquieren en una consulta en SQL Server?
Respuesta
Sugiero que encienda las Banderas de rastreo de detección de interbloqueo en primer lugar, en lugar de ejecutar un Rastreador de perfiles indefinidamente.
De esta forma, los detalles del evento se registrarán en el Registro de errores del servidor SQL.
Revise la siguiente referencia de Libros en pantalla para obtener detalles de las diversas marcas de seguimiento. Es necesario utilizar 1204 y/o 1222
http://msdn.microsoft.com/en-us/library/ms188396(SQL.90).aspx
Asegúrese de activar las marcas de traza con ámbito de servidor y no sólo la sesión actual. Por ejemplo use:
DBCC TRACEON(1222,-1)
ejecute un seguimiento en el generador de perfiles (elija la plantilla en blanco), seleccione el evento gráfico de interbloqueo y en la nueva pestaña que aparece (Configuración de extracción de eventos), guarde cada uno (verifique salvar eventos XML de interbloqueo por separado) en su propio archivo. Abra este archivo en un visor xml y será fácil saber qué está sucediendo. Cada proceso está contenido, con una pila de llamadas a procedimientos, etc. y todos los bloqueos están allí también.
Deje que este trazado se ejecute hasta que el interbloqueo vuelva a ocurrir, la información solo se graba cuando ocurre un punto muerto, por lo que no hay demasiada sobrecarga. Si nunca vuelve a suceder, está bien resuelto, si no has capturado toda la información.
Pero para hacer eso tendría que volver a crear el escenario mientras se ejecuta dejar rastro? No puedo reproducir el escenario. – Tomas
¿Cuál es la sobrecarga de ejecutar esa traza? – Tomas
ejecuta esta traza en producción, o donde sea que esté sucediendo. Si nunca vuelve a ver el punto muerto, no haga nada. si lo ves, esto registrará lo que sucedió y luego podrás descubrir qué está pasando. –
Puede ejecutar la declaración en una transacción, pero no comprometer la transacción. Dado que los bloqueos se mantendrán hasta que se haya comprometido la transacción, esto le da tiempo para inspeccionar los bloqueos. (No es por tiempo indefinido, pero al igual que 5 minutos de forma predeterminada.)
igual:
BEGIN TRANSACTION
select * from table
A continuación, abra Management Studio y comprobar los bloqueos. Están en Gestión -> Monitor de actividad -> Bloqueos por objeto o Bloqueos por proceso. Después de que haya terminado, ejecute:
COMMIT TRANSACTION
para liberar los bloqueos.
Puede ejecutar un rastreo de perfilador en su cuadro de desarrollo para las consultas y ver exactamente qué bloqueos se toman. Esta suele ser una gran cantidad de datos, pero gran parte de ella serán patrones sobre los que puede echar un vistazo. P.ej. para el aislamiento comprometido de lectura, verá una sucesión de bloqueos que se adquirirá y liberará cuando realice una exploración de tabla o índice (cada fila debe estar bloqueada antes de ser leída, y se libera inmediatamente después de que se lee).
¿Con qué aislamiento trabaja? ¿Qué tipo de consultas están bloqueando? ¿Está utilizando transacciones explícitas que abarcan múltiples actualizaciones, o son sentencias únicas de bloqueo de declaraciones?
El caso más típico de un punto muerto es una transacción con la secuencia (tabla de actualización x, tabla de actualización y) y una segunda transacción con la secuencia (tabla de actualización y, tabla de actualización x). La solución común es asegurarse de usar la misma secuencia de actualización en las consultas.
Háganos saber qué tipo de consultas son, existen diferentes problemas comunes para diferentes tipos de transacciones.
Aquí hay una consulta que le mostrará todos los bloqueos activos, quién los tiene y en qué objeto se encuentran. Saqué esto de un artículo de Technet o algo así hace años y años. Funciona en SQL 2000 y 2005 (cambie sysobjects en sys.objects para 2005.) Descomente la cláusula WHERE si desea restringirlo a este solo databse, y solo a los bloqueos "EXCLUSIVE".
select 'Locks' as Locks,
spid, nt_username, name, hostname, loginame, waittime, open_tran,
convert(varchar ,getdate() - last_batch, 114) as TimeSinceLastCommand,
case req_mode
when 0 then 'Not granted'
when 1 then 'Schema stability'
when 2 then 'Schema modification'
when 3 then 'Intent shared'
when 4 then 'Shared intent update'
when 5 then 'Intent shared shared'
when 6 then 'Intent exclusive'
when 7 then 'Shared Intent Exclusive'
when 8 then 'Shared'
when 9 then 'Update'
when 10 then 'Intent insert NULL'
when 11 then 'Intent shared exclusive'
when 12 then 'Intent update'
when 13 then 'Intent shared-update'
when 14 then 'Exclusive'
when 15 then 'Bulk operation'
else str(req_mode) end as LockMode
from master..syslockinfo
left join sysobjects so on so.id = rsc_objid
left join master..sysprocesses sp on sp.spid = req_spid
--where rsc_dbid = (select db_id()) and ltrim(req_mode) in (6,7,11,14)
Pequeño comentario: los números son un poco diferentes para SQL 2012: http://technet.microsoft.com/en-us/library/ms189497.aspx – n0rd
estancamientos Resolución de problemas:
http://blogs.msdn.com/bartd/archive/2006/09/09/747119.aspx http://blogs.msdn.com/bartd/archive/2006/09/13/751343.aspx
estancamientos reproductor de
- 1. Qué supervisar en SQL Server
- 2. sql-Concepto de cerraduras en sqlserver
- 3. SQL Server Linked Server consulta que se queda sin memoria
- 4. ¿Qué son los bloqueos de fila, página y tabla? Y cuando se adquieren?
- 5. ¿Cómo comparar una consulta SQL Server?
- 6. SQL Server Linked Server Ejemplo de consulta
- 7. ¿Por qué esta instrucción SELECT se bloqueará en SQL Server?
- 8. SQL en SQL Server
- 9. ¿Por qué ocurren bloqueos en SQL Server?
- 10. ¿Qué hace un cursor (^) en una consulta SQL?
- 11. ¿Por qué SQL Server se ralentiza cuando se usan variables?
- 12. ¿Qué es syncobj en SQL Server
- 13. Cómo usar una consulta de selección dentro de una consulta de inserción en SQL Server 2005
- 14. Consulta SQL para agregar una nueva columna después de una columna existente en SQL Server 2005
- 15. consulta de SQL Server con expresiones regulares?
- 16. IF Condición en una consulta SQL
- 17. ¿Por qué no se reconoce ROW_NUMBER() en SQL Server 2008?
- 18. adquieren dimensión física
- 19. ELIMINAR instrucción se bloquea en SQL Server sin motivo aparente
- 20. Consultas actualmente en ejecución en SQL Server
- 21. ¿Qué hace xp_qv en SQL Server?
- 22. ¿Qué es SID en SQL SERVER 2008?
- 23. Cómo generar una secuencia de comandos de la tabla mediante la consulta SQL en SQL Server
- 24. ¿Qué hace OBJECT_ID en SQL Server?
- 25. Consulta de datos de estructura de árbol en SQL Server
- 26. SQL Server 2008 consulta de tabla cruzada
- 27. Generar tabla DDL mediante consulta en MySQL y SQL Server
- 28. ¿Qué es Service Broker en SQL Server?
- 29. SQL Server Consulta para agrupar fechas secuenciales
- 30. Consulta de SQL Server Server - Contar el campo DateTime distinto
Interesante, ¿cómo puedo configurar las banderas? en un analizador de consultas? cualquier sobrecarga involucrado aquí? – Tomas
Ejecuté "DBCC TRACEON (1222, -1)" y "DBCC TRACEON (1204, -1)" y comencé una traza gráfica de interbloqueo (en el servidor sql 2005). Cuando forcé un punto muerto, el rastro lo capturó. Sin embargo, no hay ningún registro del punto muerto en el registro de errores de SQL Server. Estoy buscando en SQL Server Management Studio en el "Agente SQL Server" + "Registros de error" + "Actual -" + clic derecho + "Ver registro del agente" ¿qué podría estar haciendo mal? –
Está buscando los registros incorrectos, esos son los registros del agente. Gestión> Sql Server Logs – Sam