รายการแบบสอบถามที่ทำงานบน SQL Server


200

มีวิธีในการแสดงรายการแบบสอบถามที่กำลังทำงานบน MS SQL Server (ผ่านทาง Enterprise Manager หรือ SQL) และ / หรือผู้ที่เชื่อมต่ออยู่หรือไม่?

ฉันคิดว่าฉันได้รับข้อความค้นหาที่ใช้เวลานานมากกำลังถูกเรียกใช้งานบนเซิร์ฟเวอร์ฐานข้อมูลของฉันและฉันต้องการติดตามและหยุดมัน (หรือบุคคลที่เริ่มต้นทำงานต่อไป)

คำตอบ:


203

สิ่งนี้จะแสดง SPID ที่ใช้งานยาวนานที่สุดบนเซิร์ฟเวอร์ SQL 2000 หรือ 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

หากคุณต้องการดู SQL ที่ใช้งานสำหรับ spid ที่กำหนดจากผลลัพธ์ให้ใช้ดังนี้:

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
คุณสามารถแก้ไขสิ่งนี้เพื่อทำงานกับ SQL v12 + (เช่น Azure) โดยลบการอ้างอิงถึงต้นแบบเช่น แทนที่ 'master.dbo.sysprocesses' ด้วย 'dbo.sysprocesses'
Kevin

ฉันขอแนะนำให้เปลี่ยนmsquantization sกับ อาจเกิดการล้นได้ (เกิดขึ้นกับฉัน)
Zverev Evgeniy

สำหรับ Azure คุณอาจต้องเปลี่ยน "master.dbo.sysprocesses" ด้วย "sys.sysprocesses"
Danton Heuer

93

หากคุณใช้ SQL Server 2005 หรือ 2008 คุณสามารถใช้ DMV เพื่อค้นหาสิ่งนี้ ...

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

1
แบบสอบถามนี้ไม่ทำงานภายใต้ SQL Server 2005 หากระดับความเข้ากันได้ของฐานข้อมูลปัจจุบันต่ำกว่า 90 ถ้าความเข้ากันได้ของฐานข้อมูลปัจจุบันของคุณต่ำกว่าให้สลับไปที่ master db เพื่อเรียกใช้แบบสอบถามนี้
Alexander Pravdin

31

คุณสามารถรันคำสั่งsp_whoเพื่อรับรายการผู้ใช้เซสชันและกระบวนการปัจจุบันทั้งหมด จากนั้นคุณสามารถเรียกใช้คำสั่งKILLบน spid ใด ๆ ที่บล็อกผู้อื่นได้


3
สิ่งนี้ไม่ได้มีประโยชน์เสมอไป บางครั้งการสืบค้นดูเหมือนว่าจะสร้าง spid child โดยเฉพาะเมื่อใช้ OPENQUERY หรือเซิร์ฟเวอร์ที่เชื่อมโยง มันอาจเป็นเรื่องยากที่จะบอกสิ่งที่เป็นผู้ปกครองแบบสอบถามเพียงแค่จาก sp_who
นาธาน

17

ฉันขอแนะนำให้สอบถามsysมุมมอง สิ่งที่คล้ายกับ

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

วิธีนี้คุณจะได้รับTotalPagesAllocatedซึ่งจะช่วยให้คุณspidทราบว่ากำลังใช้ทรัพยากรเซิร์ฟเวอร์ทั้งหมดอยู่ มีหลายครั้งที่ฉันไม่สามารถดูการตรวจสอบกิจกรรมและใช้sysมุมมองเหล่านี้เพื่อดูว่าเกิดอะไรขึ้น

ฉันอยากจะแนะนำให้คุณอ่านบทความต่อไปนี้ ผมได้รับการอ้างอิงจากที่นี่


1
นอกจากนี้เรายังใช้การวิเคราะห์ Quest DB Performance ที่ให้ภาพที่ดีมากเกี่ยวกับสิ่งที่เกิดขึ้นในเซิร์ฟเวอร์ หนึ่งในสิ่งเลวร้ายเกี่ยวกับมันคือการบอกว่าใครเป็นเหยื่อ แต่มันยากที่จะรู้ว่าใครกำลังใช้ทรัพยากร สิ่งนี้จะช่วยได้
dhi

16

มีมุมมองการจัดการต่างๆในตัวผลิตภัณฑ์ บน SQL 2000 คุณต้องการใช้sysprocesses บน SQL 2K5 มีมุมมองมากขึ้นเช่นsys.dm_exec_connections , sys.dm_exec_sessionsและsys.dm_exec_requests

นอกจากนี้ยังมีขั้นตอนเช่นsp_whoที่ใช้ประโยชน์จากมุมมองเหล่านี้ ในStudio การจัดการ 2K5 คุณจะได้รับการตรวจสอบกิจกรรม

และสุดท้าย แต่ไม่น้อยที่มีส่วนร่วมกับชุมชนของสคริปต์เหมือนใครมีการใช้งานโดยอดัม Machanic


11

ที่จริงแล้วการทำงานEXEC sp_who2ในตัววิเคราะห์คำถาม / Studio sp_whoจัดการให้ข้อมูลมากกว่า

นอกเหนือจากนั้นคุณสามารถตั้งค่า SQL Profiler เพื่อดูทราฟฟิกเข้าและออกทั้งหมดไปยังเซิร์ฟเวอร์ Profiler ยังช่วยให้คุณ จำกัด ขอบเขตสิ่งที่คุณกำลังมองหา

สำหรับ SQL Server 2008:

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

โปรดทราบว่า profiler เป็นแอปบันทึกและดูอย่างแท้จริง มันจะยังคงเข้าสู่ระบบและดูตราบเท่าที่มันกำลังทำงาน มันสามารถเติมไฟล์ข้อความหรือฐานข้อมูลหรือฮาร์ดไดรฟ์ได้ดังนั้นโปรดระวังสิ่งที่คุณได้รับและระยะเวลา


1
SQL Server Profiler เป็นที่ที่ทุกคนควรเริ่มแน่นอน!
เชน

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

โปรดสังเกตว่าการตรวจสอบกิจกรรมของ SQL Server สำหรับ SQL Server 2008 สามารถคลิกขวาที่เซิร์ฟเวอร์ปัจจุบันของคุณและไปที่ "การตรวจสอบกิจกรรม" ในเมนูบริบท ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุดในการฆ่ากระบวนการหากคุณใช้ SQL Server Management Studio


นี่ควรจะเป็นความเห็น แต่ใช่มันมีประโยชน์มากและมันจะได้รับการมองเห็นมากขึ้นเป็นคำตอบ :-) และมันช่วยฉันออกตอนนี้ ขอบคุณ
Loudenvier

9

ใน Object Explorer ให้เจาะลึกลงไปที่: Server -> Management -> Activity Monitor นี่จะช่วยให้คุณเห็นการเชื่อมต่อทั้งหมดไปยังเซิร์ฟเวอร์ปัจจุบัน


1
ฉันไม่เห็นสิ่งใดที่เรียกว่าการตรวจสอบกิจกรรมภายใต้การจัดการใน SQL 2008
jpierson

5

นี่คือข้อความค้นหาที่จะแสดงข้อความค้นหาใด ๆ ที่ปิดกั้น ฉันไม่แน่ใจว่าจะแสดงข้อความค้นหาช้าหรือไม่:

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

สคริปต์ที่เหมาะสมจะเป็นเช่นนี้:

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

คุณสามารถใช้แบบสอบถามด้านล่างเพื่อค้นหาคำขอล่าสุด:

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

การใช้สคริปต์ด้านล่างคุณสามารถค้นหาจำนวนการเชื่อมต่อต่อฐานข้อมูล:

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

สำหรับรายละเอียดเพิ่มเติมกรุณาเยี่ยมชม: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/


4

ในปี 2005 คุณสามารถคลิกขวาที่ฐานข้อมูลไปที่รายงานและมีรายการรายงานทั้งหมดเกี่ยวกับการเปลี่ยนผ่านและล็อค ฯลฯ ...


4

ลองกับสิ่งนี้:

มันจะช่วยให้คุณค้นหาผู้ใช้ทั้งหมด จนถึง spid 50 ทุกอย่างเป็นเซสชันกระบวนการภายในของ sql server แต่ถ้าคุณต้องการคุณสามารถลบที่ข้อ:

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

และ

KILL @spid

2
จะดีไหม .. !! และถ้าฉันฆ่าโดย spid จะฆ่าเพียงหนึ่งแบบสอบถามหรือไม่ ข้อสงสัยของฉันคือ spid และ session_ เป็นคำถามที่ไม่ซ้ำกันสำหรับแต่ละแบบสอบถามที่ทำงานในเซสชันหรือเซิร์ฟเวอร์นั้นหรือไม่
buttowski

1

ใช้ตัวสร้างโปรไฟล์เซิร์ฟเวอร์ sql (เมนูเครื่องมือ) เพื่อตรวจสอบการดำเนินการสืบค้นและใช้การตรวจสอบกิจกรรมในสตูดิโอการจัดการเพื่อดูว่ามีการเชื่อมต่ออย่างไรและหากการเชื่อมต่อของพวกเขาบล็อกการเชื่อมต่ออื่น ๆ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.