8

SP_WHO y cómo filtrarlo

¡Nuestro proyecto no podía empezar de otra manera! Como primera entrada en nuestro blog, hemos decidido hablar sobre uno de los comandos o procedimientos más importantes y utilizados del SQL Server: sp_who.


¿Qué es sp_who y para que se utiliza?

Si nos basamos a la documentación oficial sp_who es un procedimiento almacenado del sistema que está documentado y soportado por Microsoft.

Este procedimiento almacenado nos devuelve información sobre usuarios, sesiones y procesos en una instancia del motor de base de datos de SQL Server que están corriendo en el momento de su ejecución. Se suele utilizar habitualmente cuando se desea conocer la carga de trabajo en la instancia o ver si alguno de los procesos está bloqueado.


¿Cómo se ejecuta?

Se ejecuta de la siguiente manera:

sp_who

ó

sp_who2

Si quieres filtrar por usuario:

sp_who 'test'

O por estado:

sp_who 'active'


¿Cuál es la diferencia entre SP_WHO y SP_WHO2?

Todo aquel que haya trabajado con sp_who ha escuchado hablar de su hermano sp_who2. Su principal diferencia es que sp_who2 ya no se encuentra soportado ni documentado por Microsoft, y que también nos devuelve más información que nos puede ser muy útil.

Podemos destacar como valores añadidos por sp_who2  algunas columnas como CPUTime, DiskIO y ProgramName, valores muy importantes para nuestras labores como DBAs.

Como observamos, sp_who nos devuelve la siguiente información tras la consulta de varias tablas del sistema (syslocks, sysprocesses, etc.):

  • SPID La ID del proceso del sistema.
  • STATUS el estado del proceso (RUNNABLE, SLEEPING, SUSPENDED, etc.).
  • LOGIN Nombre de usuario del usuario.
  • HOSTNAME Nombre de la máquina del usuario.
  • BLK Si el proceso se bloquea, este valor es el SPID del proceso de bloqueo.
  • DBNAME Nombre de la base de datos que está utilizando el proceso.
  • CMD El comando que se está ejecutando actualmente (por ejemplo, SELECT, INSERT)

Por parte de sp_who2 proporciona la información anterior, pero también proporciona la siguiente información adicional:

  • CPUTime Tiempo total de CPU que tomó el proceso.
  • DiskIO Cantidad total de lecturas de disco para el proceso.
  • LastBatch La última vez que un cliente llamó a un procedimiento o ejecutó una consulta.
  • ProgramName Aplicación que ha iniciado la conexión (por ejemplo, Visual Basic, MS SQL Query Analyzer)


El truco

Algo que realizamos habitualmente es almacenar y manipular los datos que nos proporciona sp_who según nuestras necesidades. Para ello almacenamos temporalmente los resultados de este comando en una tabla temporal de la siguiente manera:

CREATE TABLE #sp_who2 (SPID INT,Status VARCHAR(255),
      Login  VARCHAR(255),HostName  VARCHAR(255), 
      BlkBy  VARCHAR(255),DBName  VARCHAR(255), 
      Command VARCHAR(255),CPUTime INT, 
      DiskIO INT,LastBatch VARCHAR(255), 
      ProgramName VARCHAR(255),SPID2 INT, 
      REQUESTID INT) 
INSERT INTO #sp_who2 EXEC sp_who2
SELECT * FROM #sp_who2
-- Añadimos los filtros aqui :
WHERE       DBName like ' WideWorldImporters'
-- Añadimos el order  by aqui :
ORDER BY DBName ASC
--Importante borrar la table temporal :
DROP TABLE #sp_who2

Con esto concluimos nuestra primera entrada de nuestro blog. Si crees que nos hemos dejado algo en el tintero no dudes en escrbirnos.

Hasta la próxima.

8 comentarios

  1. Buen trabajo Toño… la people en mi curro lo usa.
    Felicidades tío!!
    Pa’lante… como debe ché!!
    Salu2

  2. Interesante y útil, ya está bien de recorrer los resultados para localizar los bloqueos.
    Muchas gracias

  3. Hola, muchas gracias por tu post, realmente me va a servir mucho… Yo tengo que restaurar bd frecuentemente y es una lata andar recorriendo la lista del sp_who2 para saber si tengo acceso exclusivo o no, así que decidí crear un sp_who3 en master, usando tu código, ojalá les sirva:

    create procedure sp_who3
    @DbsNam nvarchar(100) = ‘master’
    with encryption
    as
    set nocount on
    create table #sp_who3 (
    SPID int,
    Status varchar(255),
    Login varchar(255),
    HostName varchar(255),
    BlkBy varchar(255),
    DBName varchar(255),
    Command varchar(255),
    CPUTime int,
    DiskIO int,
    LastBatch varchar(255),
    ProgramName varchar(255),
    SPID2 int,
    REQUESTID int )
    insert into #sp_who3 exec sp_who2
    select *
    from #sp_who3
    where DBName like @DbsNam
    order by DBName

    drop table #sp_who3

    go

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *