Cuando queremos revisar cual es el estado de nuestra instancia de base de datos, lo que normalmente se estila hacer es ejecutar alguno de los siguientes procedimientos almacenados de sistema: “sp_who” o “sp_who2”, sin embargo la información que nos arroja, a mi punto de vista es muy genérica y nos dice poco en realidad de lo que actualmente se está ejecutando dentro de nuestra instancia. Otro de los problemas que le encuentro con estos procedimientos almacenados de sistema, es que arroja todas las sesiones de nuestra instancia sin importar si están activas o no, y eso distrae bastante la atención de lo que realmente importa y dificulta que uno encuentre el problema que necesita tratar de resolver.

Sin embargo estos no son los únicos recursos que tenemos a la mano, sino es que a partir de SQL Server 2005, Microsoft implemento las famosas DMVs las cuales son vistas dinámicas de sistema que exponen información de los internals de SQL Server que nos permiten tener mucha más información de lo que antes teníamos disponible, pero ahora el problema es que al tener mucha información hay que saber cómo unir esa información para que en realidad sea algo representativo que nos diga cuál es el estado de nuestra base de datos. Se puede invertir tiempo en revisar para que sirve cada una de estas DMVs, lo cual es algo recomendable, pero si se desea tener algo mas inmediato se puede utilizar el procedimiento almacenado sp_whoisactive de Adam Mechanic (b|t) el cual agrupa muchas de estas DMVs para darnos información más exacta y significativa de nuestra base de datos.

Para instalar este procedimiento almacenado se debe de simplemente ir hacia la página de descarga de sp_whoisactive, descomprimir el archivo zip y ejecutarlo en alguna base de datos, es recomendable que se haga sobre la base de datos Master, sin embargo esto no es obligatorio. Otra de las formas de instalar este procedimiento almacenado en alguno de nuestras instancias de base de datos podemos utilizar un comando del módulo de dbatools, el cual pedirá algunas confirmaciones antes de instalarlo y adicionalmente solicitara la ubicación donde desea ejecutarlo.

 

 

 

 

 

 

 

 

 

 

Una vez instalado, podremos ejecutar el procedimiento almacenado desde cualquier base de datos, éste por defecto nos mostrara sólo la sesiones que están activas en la base de datos, es decir no tendremos toda la lista de sesiones inactivas que no ayudaban a encontrar lo que realmente estaba siendo ejecutado dentro de nuestra instancia de base de datos.

 

Como se puede notar, se tiene columnas adicionales que los procedimientos almacenados de sistema no traen consigo, estas columnas son:

[dd hh:mm:ss.mss]: Muestra cuanto tiempo la sesión se ha mantenido activa, no necesariamente cuanto tiempo va ejecutando una sentencia, ya que dentro de una transacción se puede ejecutar diversas sentencias y la que actualmente vemos no necesariamente es la que está tardando más tiempo.

[sql_text]: Es el texto de la sentencia que actualmente está siendo ejecutada. Se muestra en un formato XML para podamos dar click sobre él y así poder ver la sentencia completa

[wait_info]: Es la espera actual que la sesión está teniendo dentro de la base de datos. Esta nos puede guiar a la verdadera razón por la cual nuestros usuarios reportan lentitud en la base de datos.

Este procedimiento almacenado tiene una serie de parámetros los cuales pueden modificar la cantidad de información que nos muestra por defecto, para obtener la ayuda de los parámetros que se pueden utilizar se puede ejecutar el siguiente comando:

 

A continuación mostraré algunos usos de los parámetros que particularmente encuentro bastante útiles y uso a menudo:

Sesiones que generan más bloqueos

El parámetro “@find_block_leaders” mostrará una nueva columna llamada “blocked_session_count” la cual contendrá el número de sesiones bloqueadas que están esperando que se liberen los recursos de la sesión actual, el valor que muestra es recursivo es decir contabiliza tanto a sus hijas como a las hijas de sus hijas, adicionalmente se está haciendo uso del parámetro “@sort_order” el cual permite que el resultado del procedimiento almacenado aparezca ordenado, en este caso lo ordenamos por la nueva columna para poder ubicar a la cabecera de todos los bloqueos en nuestra base de datos.

 

Planes de Ejecución

Se puede mostrar los planes de ejecución de las sentencias que están siendo ejecutadas por las sesiones activas en nuestra base de datos, esto se hace a través del parámetro “@get_plans”, cuando se agrega el parámetro y se le pasa el valor 1, se muestra una nueva columna llamada “query_plan”, la cual muestra el plan de ejecución en un formato XML, si se da click sobre el contenido de la columna se muestra el plan de ejecución grafico como lo conocemos.

 

Guardar Resultado en una Tabla

Otra de las características más interesantes de este procedimiento almacenado es que nos permite guardar el resultado del mismo en una tabla, la cual nos puede servirnos para hacer una análisis más detallado luego, e incluso poder usarla como un “baseline” de nuestra base de datos. Para poder hacer que esta característica funcione primero debemos generar la estructura de la tabla en la que se guardarán los resultados. Es necesario la generación de esta estructura ya que como hemos visto la combinación de los diferentes parámetros de sp_whoisactive provocan que se agreguen nuevas columnas entonces si deseamos guardar los resultados para una combinación de parámetros en específico, debemos utilizar los parámetros “@return_schema” y “@schema” como lo muestra el siguiente script el cual generara un script de creación de la tabla donde debemos reemplazar el nombre de la tabla a crear:

Seguidamente ya podremos ejecutar el procedimiento almacenado sp_whoisactive para que guarde los resultados en esa nueva tabla:

 

Finalmente quisiera mencionar que hay muchas mas combinaciones de los parámetros de este maravilloso procedimiento almacenado las cuales nos pueden ayudar en ocasiones determinadas. Para poder conocer mas acerca de este, los invito a revisar una serie de blog posts que hizo Adam con el fin de documentar y guiar a las personas en el correcto uso de “sp_whoisactive”, esta serie puede encontrarse aqui. Espero les ayude tanto como a mi.