Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

List the queries running on SQL Server

Writer Sebastian Wright

Is there a way to list the queries that are currently running on MS SQL Server (either through the Enterprise Manager or SQL) and/or who's connected?

I think I've got a very long running query is being execute on one of my database servers and I'd like to track it down and stop it (or the person who keeps starting it).

0

18 Answers

This will show you the longest running SPIDs on a SQL 2000 or 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

If you need to see the SQL running for a given spid from the results, use something like this:

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

If you're running SQL Server 2005 or 2008, you could use the DMV's to find this...

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

You can run the sp_who command to get a list of all the current users, sessions and processes. You can then run the KILL command on any spid that is blocking others.

1

I would suggest querying the sys views. something similar to

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

This way you can get a TotalPagesAllocated which can help you figure out the spid that is taking all the server resources. There has lots of times when I can't even bring up activity monitor and use these sys views to see what's going on.

I would recommend you reading the following article. I got this reference from here.

1

There are various management views built into the product. On SQL 2000 you'd use sysprocesses. On SQL 2K5 there are more views like sys.dm_exec_connections, sys.dm_exec_sessions and sys.dm_exec_requests.

There are also procedures like sp_who that leverage these views. In 2K5 Management Studio you also get Activity Monitor.

And last but not least there are community contributed scripts like the Who Is Active by Adam Machanic.

0

As a note, the SQL Server Activity Monitor for SQL Server 2008 can be found by right clicking your current server and going to "Activity Monitor" in the context menu. I found this was easiest way to kill processes if you are using the SQL Server Management Studio.

2

Actually, running EXEC sp_who2 in Query Analyzer / Management Studio gives more info than sp_who.

Beyond that you could set up SQL Profiler to watch all of the in and out traffic to the server. Profiler also let you narrow down exactly what you are watching for.

For SQL Server 2008:

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

Keep in mind that the profiler is truly a logging and watching app. It will continue to log and watch as long as it is running. It could fill up text files or databases or hard drives, so be careful what you have it watch and for how long.

1
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

In the Object Explorer, drill-down to: Server -> Management -> Activity Monitor. This will allow you to see all connections on to the current server.

1

Try with this:

It will provide you all user queries. Till spid 50,it's all are sql server internal process sessions. But, if you want you can remove where clause:

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

here is a query that will show any queries that are blocking. I am not entirely sure if it will just show slow queries:

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 )

The right script would be like this:

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

You can use below query to find running last request:

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

Using below script you can also find number of connection per database:

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

For more details please visit:

in 2005 you can right click on a database, go to reports and there's a whole list of reports on transitions and locks etc...

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

And

KILL @spid
1

Use Sql Server Profiler (tools menu) to monitor executing queries and use activity monitor in Management studio to see how is connected and if their connection is blocking other connections.

You should try very usefull procedure sp_whoIsActive which can be found here: and it is free.

Trying to put things together (hope to be helpful):

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, MAX(p.loginame) AS loginame, (SELECT SUBSTRING(text, COALESCE(NULLIF(spid.stmt_start, 0), 1) + 1, CASE spid.stmt_end WHEN -1 THEN DATALENGTH(text) ELSE (spid.stmt_end - spid.stmt_start) END) FROM ::fn_get_sql(spid.[sql_handle])) AS [sql]
FROM master.dbo.sysprocesses p LEFT JOIN ( SELECT ROW_NUMBER() OVER(PARTITION BY spid ORDER BY ecid) AS i, spid, [sql_handle], CASE stmt_start WHEN 0 THEN 0 ELSE stmt_start / 2 END AS stmt_start, CASE stmt_end WHEN -1 THEN -1 ELSE stmt_end / 2 END AS stmt_end FROM sys.sysprocesses ) spid ON p.spid = spid.spid AND spid.i = 1
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')
GROUP BY p.spid, p.last_batch, p.[program_name], p.hostname, spid.stmt_start, spid.stmt_end, spid.[sql_handle]
ORDER BY batch_duration DESC, p.spid
;

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy