sql-server - suchen - t sql liste aller tabellen




Listen Sie die Abfragen auf, die auf SQL Server ausgeführt werden (11)

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

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

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


Beachten Sie, dass der SQL Server-Aktivitätsmonitor für SQL Server 2008 gefunden werden kann, indem Sie mit der rechten Maustaste auf den aktuellen Server klicken und im Kontextmenü auf "Aktivitätsmonitor" gehen. Ich habe festgestellt, dass dies der einfachste Weg ist, Prozesse zu beenden, wenn Sie SQL Server Management Studio verwenden.


Das richtige Skript wäre so:

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

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üssen, dass die SQL-Anweisung für ein bestimmtes Spid aus den Ergebnissen stammt, 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    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)

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

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 können Sie eine TotalPagesAllocated der Sie herausfinden können, welche spid alle Serverressourcen spid . Es gibt viele Zeiten, in denen ich nicht einmal den Aktivitätsmonitor aufrufen kann und diese sys zu sehen, was vor sich geht.

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



Sie können die folgende Abfrage verwenden, um die letzte 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

Unter Skript finden Sie auch die Anzahl der Verbindungen pro Datenbank:

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

Für weitere Informationen besuchen Sie bitte: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/



Verwenden Sie Sql Server Profiler (Tools-Menü), um ausführende Abfragen zu überwachen, und verwenden Sie den Aktivitätsmonitor in Management Studio, um zu sehen, wie eine Verbindung hergestellt wird und ob ihre Verbindung andere Verbindungen blockiert.


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)  

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




sql-server