Listen Sie die auf SQL Server ausgeführten Abfragen auf


200

Gibt es eine Möglichkeit, die Abfragen aufzulisten, die derzeit auf MS SQL Server ausgeführt werden (entweder über Enterprise Manager oder SQL) und / oder wer verbunden ist?

Ich glaube, ich habe eine sehr lange laufende Abfrage, die auf einem meiner Datenbankserver ausgeführt wird, und ich möchte sie aufspüren und stoppen (oder die Person, die sie ständig startet).

Antworten:


203

Dies zeigt Ihnen die am längsten laufenden SPIDs auf einem SQL 2000- oder SQL 2005-Server:

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

Wenn Sie sehen möchten, dass SQL für einen bestimmten Spid aus den Ergebnissen ausgeführt wird, verwenden Sie Folgendes:

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    sys.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)

3
Sie können dies ändern, um mit SQL v12 + (z. B. Azure) zu arbeiten, indem Sie Verweise auf den Master entfernen, z. Ersetzen Sie 'master.dbo.sysprocesses' durch 'dbo.sysprocesses'
Kevin

Ich würde vorschlagen, die msQuantisierung durch zu ersetzen s. Ein möglicher Überlauf kann auftreten (ist bei mir passiert).
Zverev Evgeniy

Für Azure müssen Sie möglicherweise "master.dbo.sysprocesses" durch "sys.sysprocesses" ändern
Danton Heuer

93

Wenn Sie SQL Server 2005 oder 2008 ausführen, können Sie die DMVs verwenden, um dies zu finden ...

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

1
Diese Abfrage funktioniert unter SQL Server 2005 nicht, wenn die aktuelle Datenbankkompatibilitätsstufe unter 90 liegt. Wenn Ihre aktuelle Datenbankkompatibilität niedriger ist, wechseln Sie zur Master-Datenbank, um diese Abfrage auszuführen.
Alexander Pravdin

31

Sie können den Befehl sp_who ausführen , um eine Liste aller aktuellen Benutzer, Sitzungen und Prozesse abzurufen . Sie können dann den Befehl KILL auf jedem Spid ausführen, der andere blockiert.


3
Dies ist nicht immer hilfreich. Manchmal scheinen Abfragen untergeordnete Spids hervorzurufen, insbesondere wenn OPENQUERY oder Verbindungsserver verwendet werden. Es kann schwierig sein, die übergeordnete Abfrage nur anhand von sp_who zu erkennen.
Nathan

17

Ich würde vorschlagen, die sysAnsichten abzufragen . etwas ähnliches wie

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

Auf diese Weise erhalten Sie eine, mit TotalPagesAllocatedderen Hilfe Sie herausfinden können, spidwelche alle Serverressourcen beansprucht. Es gibt viele Male, in denen ich nicht einmal den Aktivitätsmonitor aufrufen und diese sysAnsichten verwenden kann, um zu sehen, was los ist.

Ich würde Ihnen empfehlen, den folgenden Artikel zu lesen. Ich habe diese Referenz von hier bekommen .


1
Wir verwenden auch die Quest DB-Leistungsanalyse, die ein sehr gutes visuelles Bild der Vorgänge auf dem Server liefert. Eines der schlechten Dinge dabei ist, dass es sagt, wer Opfer ist, aber es ist schwer herauszufinden, wer die Ressourcen verbraucht. Dies würde jedoch helfen.
Dhi


11

Tatsächlich EXEC sp_who2liefert das Ausführen in Query Analyzer / Management Studio mehr Informationen als sp_who.

Darüber hinaus können Sie SQL Profiler so einrichten, dass der gesamte ein- und ausgehende Datenverkehr zum Server überwacht wird. Mit Profiler können Sie auch genau eingrenzen, wonach Sie suchen.

Für SQL Server 2008:

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

Denken Sie daran, dass der Profiler wirklich eine App zum Protokollieren und Beobachten ist. Es wird weiterhin protokolliert und überwacht, solange es ausgeführt wird. Es könnte Textdateien, Datenbanken oder Festplatten füllen. Achten Sie also darauf, was und wie lange Sie sehen.


1
In SQL Server Profiler sollte auf jeden Fall jeder anfangen!
Shane

11
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

11

Hinweis: Der SQL Server-Aktivitätsmonitor für SQL Server 2008 kann gefunden werden, indem Sie mit der rechten Maustaste auf Ihren aktuellen Server klicken und im Kontextmenü zu "Aktivitätsmonitor" wechseln. Ich fand, dass dies der einfachste Weg ist, Prozesse abzubrechen, wenn Sie SQL Server Management Studio verwenden.


Dies hätte ein Kommentar sein sollen, aber ja, es ist so nützlich und wird als Antwort sichtbarer :-) Und es hat mir gerade geholfen. Vielen Dank
Loudenvier

9

Führen Sie im Objekt-Explorer einen Drilldown zu: Server -> Verwaltung -> Aktivitätsmonitor. Auf diese Weise können Sie alle Verbindungen zum aktuellen Server anzeigen.


1
Ich sehe nichts namens Activity Monitor unter Management unter SQL 2008.
jpierson

5

Hier ist eine Abfrage, die alle blockierenden Abfragen anzeigt. Ich bin mir nicht ganz sicher, ob nur langsame Abfragen angezeigt werden:

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 )

5

Das richtige Skript wäre wie folgt:

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

5

Sie können die folgende Abfrage verwenden, um die letzte laufende Anfrage zu finden:

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

Mit dem folgenden Skript können Sie auch die Anzahl der Verbindungen pro Datenbank ermitteln:

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

Weitere Informationen finden Sie unter: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/


4

2005 können Sie mit der rechten Maustaste auf eine Datenbank klicken, zu Berichten gehen und es gibt eine ganze Liste von Berichten über Übergänge und Sperren usw.


4

Versuchen Sie es damit:

Sie erhalten alle Benutzeranfragen. Bis 50 sind es nur interne SQL Server-Prozesssitzungen. Wenn Sie möchten, können Sie jedoch die where-Klausel entfernen:

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

2
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

Und

KILL @spid

2
Wird das in Ordnung sein .. !! und wenn ich durch Spid töte. Wird das nur eine Abfrage töten? Mein Zweifel ist, dass spid und session_is für jede Abfrage, die in dieser Sitzung oder auf diesem Server ausgeführt wird, eindeutig sind.
Buttowski

1

Verwenden Sie den SQL Server Profiler (Menü Extras), um die Ausführung von Abfragen zu überwachen, und verwenden Sie den Aktivitätsmonitor in Management Studio, um festzustellen, wie die Verbindung hergestellt ist und ob die Verbindung andere Verbindungen blockiert.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.