Daftar kueri yang berjalan di SQL Server

200

Apakah ada cara untuk membuat daftar pertanyaan yang sedang berjalan di MS SQL Server (baik melalui Enterprise Manager atau SQL) dan / atau siapa yang terhubung?

Saya pikir saya punya query yang berjalan sangat lama sedang dijalankan di salah satu server database saya dan saya ingin melacaknya dan menghentikannya (atau orang yang terus memulainya).

BIBD
sumber

Jawaban:

203

Ini akan menunjukkan Anda SPID berjalan terpanjang pada server SQL 2000 atau 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

Jika Anda perlu melihat SQL berjalan untuk spid yang diberikan dari hasil, gunakan sesuatu seperti ini:

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)
Mike Forman
sumber
3
Anda dapat memodifikasi ini agar berfungsi dengan SQL v12 + (mis. Azure) dengan menghapus referensi ke master, mis. ganti 'master.dbo.sysprocesses' dengan 'dbo.sysprocesses'
Kevin
Saya akan menyarankan mengganti mskuantisasi dengan s. Kemungkinan overflow dapat terjadi (terjadi pada saya).
Zverev Evgeniy
Untuk Azure Anda mungkin perlu mengubah "master.dbo.sysprocesses" dengan "sys.sysprocesses"
Danton Heuer
93

Jika Anda menjalankan SQL Server 2005 atau 2008, Anda bisa menggunakan DMV untuk menemukan ini ...

SELECT  *
FROM    sys.dm_exec_requests  
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)  
Scott Ivey
sumber
1
Kueri ini tidak berfungsi di bawah SQL Server 2005 jika tingkat kompatibilitas basis data saat ini lebih rendah dari 90. Jika kompatibilitas basis data Anda saat ini lebih rendah, beralih ke master db untuk menjalankan kueri ini.
Alexander Pravdin
31

Anda dapat menjalankan perintah sp_who untuk mendapatkan daftar semua pengguna saat ini, sesi dan proses. Anda kemudian dapat menjalankan perintah KILL pada spid yang memblokir orang lain.

Ichiban
sumber
3
Ini tidak selalu membantu. Terkadang kueri sepertinya memunculkan spid anak, terutama saat OPENQUERY atau server terkait sedang digunakan. Sulit untuk mengatakan apa permintaan induk hanya dari sp_who.
Nathan
17

Saya sarankan untuk menanyakan systampilan. sesuatu yang mirip dengan

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

Dengan cara ini Anda bisa mendapatkan TotalPagesAllocatedyang dapat membantu Anda mengetahui spidyang mengambil semua sumber daya server. Ada banyak waktu ketika saya bahkan tidak bisa membuka monitor aktivitas dan menggunakan systampilan ini untuk melihat apa yang terjadi.

Saya akan merekomendasikan Anda membaca artikel berikut. Saya mendapat referensi ini dari sini .

dhi
sumber
1
Kami juga menggunakan analisis Kinerja Quest DB yang memberikan gambaran visual yang sangat baik tentang apa yang terjadi di server. Salah satu hal buruk tentang itu adalah memberitahu siapa yang menjadi korban tetapi sulit untuk mengetahui siapa yang mengonsumsi sumber daya. Ini akan membantu.
dhi
11

Sebenarnya, menjalankan EXEC sp_who2di Query Analyzer / Management Studio memberikan lebih banyak info daripada sp_who.

Selain itu, Anda dapat mengatur SQL Profiler untuk menonton semua lalu lintas masuk dan keluar ke server. Profiler juga memungkinkan Anda mempersempit apa yang Anda tonton.

Untuk SQL Server 2008:

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

Perlu diingat bahwa profiler benar-benar aplikasi logging dan menonton. Itu akan terus login dan menonton selama itu berjalan. Itu bisa mengisi file teks atau database atau hard drive, jadi hati-hati apa yang Anda tonton dan berapa lama.

tlatourelle
sumber
1
SQL Server Profiler adalah tempat di mana setiap orang harus memulai, pasti!
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
Howard Rothenburg
sumber
11

Sebagai catatan, Monitor Aktivitas SQL Server untuk SQL Server 2008 dapat ditemukan dengan mengklik kanan server Anda saat ini dan pergi ke "Monitor Aktivitas" di menu konteks. Saya menemukan ini adalah cara termudah untuk mematikan proses jika Anda menggunakan SQL Server Management Studio.

prenster
sumber
Ini seharusnya komentar, tapi, ya, itu sangat berguna dan mendapat lebih banyak visibilitas sebagai jawaban :-) Dan itu membantu saya keluar sekarang. Terima kasih
Loudenvier
9

Di Object Explorer, telusuri ke: Server -> Manajemen -> Monitor Aktivitas. Ini akan memungkinkan Anda untuk melihat semua koneksi ke server saat ini.

Tyler
sumber
1
Saya tidak melihat sesuatu yang disebut Activity Monitor di bawah Manajemen pada SQL 2008.
jpierson
5

di sini adalah kueri yang akan menampilkan kueri apa pun yang memblokir. Saya tidak sepenuhnya yakin apakah itu hanya akan menampilkan pertanyaan lambat:

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 )
Steve Stedman
sumber
5

Script yang tepat akan seperti ini:

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
Gabriel Aizcorbe
sumber
5

Anda dapat menggunakan kueri di bawah ini untuk menemukan menjalankan permintaan terakhir:

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

Dengan menggunakan skrip di bawah ini Anda juga dapat menemukan jumlah koneksi per basis data:

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

Untuk lebih jelasnya silakan kunjungi: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/

Landasan
sumber
4

pada tahun 2005 Anda dapat mengklik kanan pada database, pergi ke laporan dan ada seluruh daftar laporan tentang transisi dan kunci dll ...

DForck42
sumber
4

Coba dengan ini:

Ini akan memberi Anda semua pertanyaan pengguna. Hingga spid 50, itu semua adalah sesi proses internal sql server. Tapi, jika mau, Anda bisa menghapus di mana klausa:

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
Shiwangini
sumber
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

Dan

KILL @spid
buttowski
sumber
2
akankah ini baik-baik saja .. !! dan jika saya membunuh dengan spid. apakah itu akan membunuh hanya satu permintaan? keraguan saya spid dan session_is unik untuk setiap kueri yang berjalan di sesi atau server itu?
buttowski
1

Gunakan Sql Server Profiler (menu alat) untuk memantau permintaan eksekusi dan menggunakan monitor aktivitas di studio Manajemen untuk melihat bagaimana terhubung dan jika koneksi mereka memblokir koneksi lain.

Beatles1692
sumber
1

Anda harus mencoba prosedur sp_whoIsActiveyang sangat berguna yang dapat ditemukan di sini: http://whoisactive.com dan gratis.

Sasa
sumber