Microsoft proporcionar muchas herramientas para analizar los bloqueos que se gestionan en SQL Server. El análisis se puede complicar todo lo que necesite. En esta breve publicación quiero enumerar las herramientas que tenéis para introduciros y empezar a mirar los bloqueos que tiene su servidor.

En principio, con lo que proporciona Microsoft SQL Server suele ser más que suficiente. Si profesionalmente te dedicas a SQL Server (eres DBA (o accidental), o eres consultor) las herramientas de Microsoft son más que suficiente para luego usted mismo tirar del hilo.

El nivel de complejidad que quiera analizar depende del problema al que se enfrente. Intenta reproducir el problema en un entorno controlado/desarrollo; parafraseando a Confucio: “si lo puede reproducir, es que lo ha entendido”. La experiencia le dirá si siempre necesita reproducirlo porque los escenarios se pueden complicar mucho. En esos casos, con interpretar los datos que proporcionan las herramientas suele ser suficiente.

Si desea introducirse en el análisis de bloqueos le recomiendo los siguientes enlaces:

Si desea herramientas de la comunidad para analizar los bloqueos, le recomiendo los siguientes enlaces:

Para una visión rápida de los bloqueos, recomiendo empezar desde lo más sencillo, a saber:

  • Informes personalizados de SSMS
  • Informe de bloqueos en SQL Profiler
  • Procedimientos almacenados sp_who, sp_who2, y sp_lock
  • Consultas contra sys.sysprocesses (utilizado por los recursos mencionados en párrafo anterior)

 

Para ver los informes personalizados de SSMS, vea la siguiente imagen:

informes-ssms

Para ver los informes de bloqueos de SQL Profiler, debe hacer lo siguiente:

  • Configurar SQL Server para activar el informe de bloqueos cada n segundos (en el ejemplo de abajo cada 5 segundos)

 

-- configure blocked process report
--
sp_configure 'show advanced options', 1;
GO

RECONFIGURE ;
GO

sp_configure 'blocked process threshold', 5 ;
GO

RECONFIGURE WITH OVERRIDE;
GO

 

Si quiere deshabilitarlo utilice la siguiente instrucción:

-- disable

sp_configure 'blocked process threshold', 0 ;
GO

RECONFIGURE WITH OVERRIDE;

 

  • Habilitar una traza de SQL Profiler habilitando el siguiente evento:

blocked-report

  • Revisar el informe de bloqueos que se generará cada 5 segundos en mi caso, donde se puede ver información como la siguiente:

blocked-report-2

  • Proceso bloqueante <blocking-process>
  • Proceso bloqueado <blocked-process>
  • Recurso bloquedo (waitresource)
  • Instrucciones afectadas (sección Execution Stack)
<blocked-process>
<process id="process305b088" taskpriority="0" logused="0" waitresource="KEY: 5:72057594046709760 (0ca7b7436f59)" waittime="5665" ownerId="1326009" transactionname="SELECT" lasttranstarted="2015-06-09T17:09:51.757" XDES="0x47b34fbe0" lockMode="S" schedulerid="2" kpid="8368" status="suspended" spid="52" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2015-06-09T17:09:51.753" lastbatchcompleted="2015-06-09T17:09:51.753" lastattention="1900-01-01T00:00:00.753" clientapp="Microsoft SQL Server Management Studio - Query" hostname="SNUCKI9" hostpid="1428" loginname="snucki9erincon" isolationlevel="read committed (2)" xactid="1326009" currentdb="5" lockTimeout="4294967295" clientoption1="671098976" clientoption2="390200">
<executionStack>
<frame line="2" stmtstart="16" stmtend="156" sqlhandle="0x02000000012bad069889c0e5ba1b003c869f3e63c035d5330000000000000000000000000000000000000000"/>
<frame line="2" stmtstart="4" stmtend="152" sqlhandle="0x02000000596f62374363d5fa4617a0cc88080f37f6c58dee0000000000000000000000000000000000000000"/>
</executionStack>
<inputbuf>
SELECT COUNT(*) FROM [Sales].[SalesOrderDetail]
WHERE SalesOrderID = 43659
</inputbuf>
</process>
</blocked-process>
<blocking-process>
<process status="sleeping" spid="53" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2015-06-09T17:09:47.433" lastbatchcompleted="2015-06-09T17:09:47.437" lastattention="1900-01-01T00:00:00.437" clientapp="Microsoft SQL Server Management Studio - Query" hostname="SNUCKI9" hostpid="1428" loginname="snucki9erincon" isolationlevel="read committed (2)" xactid="1325977" currentdb="5" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">
<executionStack/>
<inputbuf>

UPDATE [Sales].[SalesOrderDetail]
SET UnitPrice+=1
WHERE SalesOrderID = 43659

</inputbuf>
</process>
</blocking-process>
</blocked-process-report>

Conclusión:

El objetivo del post es proporcionar herramientas al lector para poder hacer diagnósticos de bloqueos con herramientas al alcance de cualquier (de Microsoft o de la comunidad). En próximas publicaciones veremos otros mecanismos/procedimientos.

Eladio Rincón

Eladio Rincón is professionally focused on SQL Server databases. He is an MVP on SQL Server since 2003, and his area of expertise is resolution of performance and scalability issues for OLTP based systems. His professional career revolves on SQL Server mentoring, consulting, and training projects. He believes that mixing training and mentoring projects is the best approach to help the clients to get the most from SQL Server. With other mentors of SolidQ he has developed a tuning methodology applied in most of the SQL Server consulting projects.