web-dev-qa-db-fra.com

Lister les requêtes en cours d'exécution sur SQL Server

Existe-t-il un moyen de répertorier les requêtes en cours d'exécution sur MS SQL Server (via Enterprise Manager ou SQL) et/ou les personnes connectées?

Je pense avoir une très longue requête en cours d'exécution sur l'un de mes serveurs de base de données et j'aimerais la localiser et l'arrêter (ou la personne qui continue à la démarrer).

180
BIBD

Cela vous montrera les SPID les plus anciens sur un serveur SQL 2000 ou SQL 2005:

select
    P.spid
,   right(convert(varchar, 
            dateadd(ms, datediff(ms, P.last_batch, getdate()), '1900-01-01'), 
            121), 12) as 'batch_duration'
,   P.program_name
,   P.hostname
,   P.loginame
from master.dbo.sysprocesses P
where P.spid > 50
and      P.status not in ('background', 'sleeping')
and      P.cmd not in ('AWAITING COMMAND'
                    ,'MIRROR HANDLER'
                    ,'LAZY WRITER'
                    ,'CHECKPOINT SLEEP'
                    ,'RA MANAGER')
order by batch_duration desc

Si vous avez besoin de voir le SQL en cours d'exécution pour un spid donné à partir des résultats, utilisez quelque chose comme ceci:

declare
    @spid int
,   @stmt_start int
,   @stmt_end int
,   @sql_handle binary(20)

set @spid = XXX -- Fill this in

select  top 1
    @sql_handle = sql_handle
,   @stmt_start = case stmt_start when 0 then 0 else stmt_start / 2 end
,   @stmt_end = case stmt_end when -1 then -1 else stmt_end / 2 end
from    master.dbo.sysprocesses
where   spid = @spid
order by ecid

SELECT
    SUBSTRING(  text,
            COALESCE(NULLIF(@stmt_start, 0), 1),
            CASE @stmt_end
                WHEN -1
                    THEN DATALENGTH(text)
                ELSE
                    (@stmt_end - @stmt_start)
                END
        )
FROM ::fn_get_sql(@sql_handle)
178
Mike Forman

Si vous utilisez SQL Server 2005 ou 2008, vous pouvez utiliser le DMV pour trouver ceci ...

SELECT  *
FROM    sys.dm_exec_requests  
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)  
83
Scott Ivey

Vous pouvez exécuter la commande sp_who pour obtenir la liste de tous les utilisateurs, sessions et processus en cours. Vous pouvez ensuite exécuter la commande KILL sur tout spid qui en bloque d'autres.

29
ichiban

Je suggérerais d'interroger les vues sys. quelque chose de semblable à 

SELECT * 
FROM 
   sys.dm_exec_sessions s
   LEFT  JOIN sys.dm_exec_connections c
        ON  s.session_id = c.session_id
   LEFT JOIN sys.dm_db_task_space_usage tsu
        ON  tsu.session_id = s.session_id
   LEFT JOIN sys.dm_os_tasks t
        ON  t.session_id = tsu.session_id
        AND t.request_id = tsu.request_id
   LEFT JOIN sys.dm_exec_requests r
        ON  r.session_id = tsu.session_id
        AND r.request_id = tsu.request_id
   OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) TSQL

De cette façon, vous pouvez obtenir une TotalPagesAllocated qui peut vous aider à déterminer la spid qui utilise toutes les ressources du serveur. Il arrive souvent que je ne puisse même pas afficher le moniteur d'activité et utiliser ces vues sys pour voir ce qui se passe. 

Je vous recommande de lire l'article suivant. J'ai cette référence à partir d'ici .

15
dhi

Il existe différentes vues de gestion intégrées au produit. Sur SQL 2000, vous utiliseriez sysprocesses . Sur SQL 2K5, il existe plusieurs vues telles que sys.dm_exec_connections , sys.dm_exec_sessions et sys.dm_exec_requests .

Il existe également des procédures telles que sp_who qui exploitent ces vues. Dans 2K5 Management Studio vous obtenez également le moniteur d'activité.

Et le dernier mais non le moindre, il y a des scripts contribués par la communauté comme le Who Is Active de Adam Machanic .

14
Remus Rusanu
SELECT
    p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, r.command,
    p.program_name, text 
FROM
    sys.dm_exec_requests AS r,
    master.dbo.sysprocesses AS p 
    CROSS APPLY sys.dm_exec_sql_text(p.sql_handle)
WHERE
    p.status NOT IN ('sleeping', 'background') 
AND r.session_id = p.spid
10
Howard Rothenburg

En fait, exécuter EXEC sp_who2 dans Query Analyzer/Management Studio donne plus d’informations que sp_who.

En outre, vous pouvez configurer SQL Profiler pour surveiller tout le trafic entrant et sortant sur le serveur. Profiler vous permet également de préciser exactement ce que vous recherchez.

Pour SQL Server 2008:

START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler

Gardez à l'esprit que le profileur est vraiment une application de journalisation et de surveillance. Il continuera à se connecter et à regarder tant qu'il est en cours d'exécution. Cela pourrait remplir des fichiers texte, des bases de données ou des disques durs, alors faites bien attention à ce que vous regardez et à combien de temps.

10
tlatourelle

Dans l'explorateur d'objets, accédez au menu suivant: Serveur -> Gestion -> Moniteur d'activité. Cela vous permettra de voir toutes les connexions sur le serveur actuel.

7
Tyler

Notez que le Moniteur d'activité SQL Server pour SQL Server 2008 peut être trouvé en cliquant avec le bouton droit de la souris sur votre serveur actuel et en sélectionnant "Moniteur d'activité" dans le menu contextuel. J'ai trouvé que c'était le moyen le plus simple de tuer des processus si vous utilisiez SQL Server Management Studio.

6
prenster

Le bon script serait comme ça:

select 
p.spid, p.status,p.hostname,p.loginame,p.cpu,r.start_time, t.text
    from sys.dm_exec_requests as r, sys.sysprocesses p 
    cross apply sys.dm_exec_sql_text(p.sql_handle) t
    where p.status not in ('sleeping', 'background')
    and r.session_id=p.spid
4
Gabriel Aizcorbe

voici une requête qui montrera toutes les requêtes bloquantes. Je ne suis pas tout à fait sûr que cela affichera simplement des requêtes lentes:

SELECT p.spid
,convert(char(12), d.name) db_name
, program_name
, convert(char(12), l.name) login_name
, convert(char(12), hostname) hostname
, cmd
, p.status
, p.blocked
, login_time
, last_batch
, p.spid
FROM      master..sysprocesses p
JOIN      master..sysdatabases d ON p.dbid =  d.dbid
JOIN      master..syslogins l ON p.sid = l.sid
WHERE     p.blocked = 0
AND       EXISTS (  SELECT 1
          FROM      master..sysprocesses p2
          WHERE     p2.blocked = p.spid )
4
Steve Stedman

Vous pouvez utiliser la requête ci-dessous pour trouver la dernière requête en cours d'exécution: 

SELECT
    der.session_id
    ,est.TEXT AS QueryText
    ,der.status
    ,der.blocking_session_id
    ,der.cpu_time
    ,der.total_elapsed_time
FROM sys.dm_exec_requests AS der
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS est

En utilisant le script ci-dessous, vous pouvez également trouver le nombre de connexions par base de données:

SELECT 
    DB_NAME(DBID) AS DataBaseName
    ,COUNT(DBID) AS NumberOfConnections
    ,LogiName 
FROM sys.sysprocesses
WHERE DBID > 0
GROUP BY DBID, LogiName

Pour plus de détails, veuillez visiter: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/

3
Anvesh

en 2005, vous pouvez cliquer avec le bouton droit sur une base de données, accéder aux rapports et vous trouverez une liste complète de rapports sur les transitions, les verrous, etc.

3
DForck42
SELECT 
    p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, t.text
FROM
    sys.dm_exec_requests as r,
    master.dbo.sysprocesses as p
    CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) t
WHERE
    p.status NOT IN ('sleeping', 'background')
AND r.session_id = p.spid

Et

KILL @spid
1
buttowski

Essayez avec ceci:

Il vous fournira toutes les requêtes des utilisateurs. Jusqu'au spid 50, il s'agit de sessions de processus internes au serveur SQL. Mais, si vous le souhaitez, vous pouvez supprimer la clause where:

select
r.session_id,
r.start_time,
s.login_name,
c.client_net_address,
s.Host_name,
s.program_name,
st.text
from sys.dm_exec_requests r
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
left join sys.dm_exec_connections c
on r.session_id = c.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st where r.session_id  > 50
0
Channa

Vous devriez essayer une procédure très utile sp_whoIsActive qui peut être trouvée ici: http://whoisactive.com et c'est gratuit.

0
Sasa

Utilisez SQL Server Profiler (menu Outils) pour contrôler l’exécution de requêtes et utilisez le moniteur d’activité dans Management Studio pour voir comment se connecte et si sa connexion bloque d’autres connexions.

0
Beatles1692