When I run sp_whoisactive, it returns results in a few seconds, while the following SQL, that also shows what is running on sql server takes much longer (several minutes). Why is there a big difference in performance and how it can be improved? I
like the custom SQL as I can slice and dice the results that way I like, if it performs better.
SELECT Des.session_id,
Der.total_elapsed_time,
CONVERT(VARCHAR, DATEDIFF(mi, der.start_time, CURRENT_TIMESTAMP)) AS ElapsedTIMEINMinutes,
Des.status,
Des.login_name,
Des.host_name,
Der.blocking_session_id,
DB_NAME(Der.database_id) AS Database_Name,
Der.command,
Des.cpu_time,
Emg.requested_memory_kb,
Emg.granted_memory_kb,
Emg.used_memory_kb,
Der.wait_type,
Der.wait_time,
Der.last_wait_type,
Der.wait_resource,
Des.reads,
Des.writes,
dec.last_write,
Des.program_name,
CASE Des.transaction_isolation_level
WHEN 0
THEN 'Unspecified'
WHEN 1
THEN 'ReadUncommitted'
WHEN 2
THEN 'ReadCommitted'
WHEN 3
THEN 'Repeatable'
WHEN 4
THEN 'Serializable'
WHEN 5
THEN 'Snapshot'
END AS Transaction_Isolation_Level,
OBJECT_NAME(Dest.objectid, Der.database_id) AS OBJECT_NAME,
Dest.text AS Full_Query_Text,
SUBSTRING(Dest.text, Der.statement_start_offset/2, (CASE
WHEN Der.statement_end_offset = -1
THEN DATALENGTH(Dest.text)
ELSE Der.statement_end_offset
END-Der.statement_start_offset)/2) AS Executing_Statement,
Deqp.query_plan
FROM sys.dm_exec_sessions AS Des
LEFT JOIN sys.dm_exec_requests AS Der ON Des.session_id = Der.session_id
LEFT JOIN sys.dm_exec_connections AS dec ON Des.session_id = dec.session_id
LEFT JOIN sys.dm_exec_query_memory_grants AS Emg ON Des.session_id = Emg.session_id
CROSS APPLY sys.dm_exec_sql_text(Der.sql_handle) AS Dest
CROSS APPLY sys.dm_exec_query_plan(Der.plan_handle) AS Deqp
WHERE Des.session_id <> @@SPID
ORDER BY Des.cpu_time DESC, granted_memory_kb;
Thanks for your help.