SQL Server'da çalışan sorguları listele


200

Şu anda MS SQL Server'da (Enterprise Manager veya SQL aracılığıyla) çalışan ve / veya bağlı olan sorguları listelemenin bir yolu var mı?

Ben çok uzun çalışan bir sorgu var benim veritabanı sunucularından birinde yürütmek var ve bunu izlemek ve durdurmak (ya da onu başlatan kişi) istiyorum.

Yanıtlar:


203

Bu size bir SQL 2000 veya SQL 2005 sunucusunda çalışan en uzun SPID'leri gösterecektir:

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

Sonuçlardan belirli bir örümcek için SQL'in çalıştığını görmeniz gerekiyorsa, şöyle bir şey kullanın:

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
Bunu, master referanslarını kaldırarak SQL v12 + (örn. Azure) ile çalışacak şekilde değiştirebilirsiniz. 'master.dbo.sysprocesses' yerine 'dbo.sysprocesses' yazın
Kevin

msNicemlemeyi değiştirmenizi öneririm s. Olası bir taşma meydana gelebilir (benim için oldu).
Zverev Evgeniy

Azure için "master.dbo.sysprocesses" i "sys.sysprocesses" ile değiştirmeniz gerekebilir
Danton Heuer

93

SQL Server 2005 veya 2008 çalıştırıyorsanız, bunu bulmak için DMV'leri kullanabilirsiniz ...

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

1
Geçerli veritabanı uyumluluk düzeyi 90'dan düşükse, bu sorgu SQL Server 2005 altında çalışmaz. Geçerli veritabanı uyumluluğunuz daha düşükse, bu sorguyu çalıştırmak için ana db'ye geçin.
Alexander Pravdin

31

Geçerli tüm kullanıcıların, oturumların ve işlemlerin bir listesini almak için sp_who komutunu çalıştırabilirsiniz . Daha sonra KILL komutunu başkalarını engelleyen herhangi bir örümcek üzerinde çalıştırabilirsiniz .


3
Bu her zaman yardımcı olmaz. Bazen sorgular, özellikle OPENQUERY veya bağlantılı sunucular kullanıldığında çocuk örümceklerini ortaya çıkarır. Sadece sp_who'dan üst sorgunun ne olduğunu söylemek zor olabilir.
Nathan

17

sysGösterim sorgulama öneririm . benzer bir şey

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

Bu şekilde , tüm sunucu kaynaklarını TotalPagesAllocatedaldığını anlamanıza yardımcı olabilecek bir tane alabilirsiniz spid. Etkinlik izleyicisini bile açamadığımda ve sysneler olup bittiğini görmek için bu görünümleri kullanamadığımda birçok kez var.

Aşağıdaki makaleyi okumanızı tavsiye ederim. Bu referansı buradan aldım .


1
Sunucuda neler olup bittiğine dair çok iyi bir görsel resim veren Quest DB Performans analizini de kullanıyoruz. Bununla ilgili kötü şeylerden biri, kimin kurban olduğunu söyler, ancak kaynakları kimin tükettiğini bulmak zordur. Bu yardımcı olur.
DHI


11

Aslında, EXEC sp_who2Query Analyzer / Management Studio'da çalıştırmak daha fazla bilgi verir sp_who.

Bunun ötesinde, SQL Profiler'ı sunucuya gelen tüm giriş ve çıkış trafiğini izleyecek şekilde ayarlayabilirsiniz. Profiler ayrıca tam olarak izlediğiniz şeyi daraltmanıza izin verir.

SQL Server 2008 için:

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

Profil oluşturucunun gerçekten bir günlük kaydı ve izleme uygulaması olduğunu unutmayın. Çalışmaya devam ettiği sürece günlüğe kaydetmeye ve izlemeye devam eder. Metin dosyalarını, veritabanlarını veya sabit diskleri doldurabilir, bu yüzden ne izlediğinize ve ne kadar sürdüğüne dikkat edin.


1
SQL Server Profiler kesinlikle herkesin başlaması gereken yerdir!
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

Not olarak, SQL Server 2008 için SQL Server Etkinlik İzleyicisi, geçerli sunucunuzu sağ tıklatıp içerik menüsünde "Etkinlik İzleyicisi" ne giderek bulunabilir. SQL Server Management Studio kullanıyorsanız, bu işlemleri öldürmek için en kolay yol olduğunu buldum.


Bu bir yorum olmalıydı, ama evet, çok kullanışlı ve bir cevap olarak daha fazla görünürlük kazanıyor :-) Ve şu anda bana yardımcı oldu. Teşekkür ederim
Loudenvier

9

Nesne Gezgini'nde aşağıdakilere gidin: Sunucu -> Yönetim -> Etkinlik Monitörü. Bu, geçerli sunucuya yapılan tüm bağlantıları görmenizi sağlar.


1
SQL 2008'de Yönetim altında Etkinlik Monitörü olarak adlandırılan bir şey görmüyorum.
jpierson

5

İşte engelleme yapan sorguları gösteren bir sorgu. Sadece yavaş sorgular gösterecek tamamen emin değilim:

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

Doğru komut dosyası şöyle olurdu:

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

Çalışan son isteği bulmak için aşağıdaki sorguyu kullanabilirsiniz:

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

Aşağıdaki komut dosyasını kullanarak veritabanı başına bağlantı sayısını da bulabilirsiniz:

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

Daha fazla bilgi için lütfen şu adresi ziyaret edin: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-ebox-user-in-sql-server/


4

2005 yılında bir veritabanına sağ tıklayabilir, raporlara gidebilir ve geçişler ve kilitler vb.


4

Şunu deneyin:

Size tüm kullanıcı sorgularını sağlayacaktır. Spid 50 kadar, hepsi sql sunucusu dahili süreç oturumları. Ancak, isterseniz yan tümceyi kaldırabilirsiniz:

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

3
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

Ve

KILL @spid

2
Bu iyi olacak mı .. !! ve eğer örümcek ile öldürürsem. bu sadece bir sorguyu öldürecek mi? şüphem spid ve session_is o oturumda veya sunucuda çalışan her sorgu için benzersizdir?
buttowski

1

Yürütme sorgularını izlemek için Sql Server Profiler'ı (araçlar menüsü) kullanın ve nasıl bağlandığını ve bağlantılarının diğer bağlantıları engelleyip engellemediğini görmek için Management Studio'da etkinlik izleyicisini kullanın.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.