As a database admin or one of the main guys in SQL Server admin group, we always want to see what's going on the sever level. Example: What are the session Id's that are active , Is there any head blocks occurring due to which the server is having high load or is there anyone running an expensive query that is sucking all the server resources. As a part of SQL Server tools , SQL Server management studio provides a utility called Activity Monitor that gives a very good picture of whats going on. We are here not to discuss the Activity Monitor but another way by which you can figure out what going on in the server. The reason i am presenting this because many times when the load on the server increases , there are times Activity monitor can't even come up and you are stuck.
This situation could happen when the server is running on low memory, high CPU usage or may be a process that is sucking all the server resources. I will present a query that will help monitor current SQL Server processes even when you can't bring up Activity Monitor and figure out what might be the cause of down of the problem. There have been a number of times that I couldn't bring up the activity monitor and use this query to figure out the SessionId(SPID) that is causing the problems to the SQL Server.
The following TSQL code queries the sys database and figure out the current processes on the SQL Server and also provides the total number of pages allocated to the process. You should sort it by total number of pages allocated (descending) to get the most expensive process running.
SELECT s.session_id AS 'SessionId',
s.login_name AS 'Login',
COALESCE(s.host_name, c.client_net_address) AS 'Host',
s.program_name AS 'Application',
t.task_state AS 'TaskState',
r.start_time AS 'TaskStartTime',
r.[status] AS 'TaskStatus',
r.wait_type AS 'TaskWaitType',
TSQL.[text] AS 'TSQL',
(
tsu.user_objects_alloc_page_count - tsu.user_objects_dealloc_page_count
) +(
tsu.internal_objects_alloc_page_count - tsu.internal_objects_dealloc_page_count
) AS 'TotalPagesAllocated'
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
WHERE (
tsu.user_objects_alloc_page_count - tsu.user_objects_dealloc_page_count
) +(
tsu.internal_objects_alloc_page_count - tsu.internal_objects_dealloc_page_count
) > 0;
I would suggest you wrap this query in a view and query the view using order by TotalPagesAllocated DESC. You can then KILL the SPID that is causing an issue or figure out where the problem is coming from. I will briefly discuss the columns returned by this query :
1)SessionID: The unique number assigned to a process connected to SQL Server. This is also called a SPID.
2) Login: The login to which the task is tied.
3) Host: The host from where the task is originated.
4) Application: The application that invokes this task.
5) TaskState: The current state of the task.
6) TaskStartTime: The time at which the task began.
7) TaskStatus: The current status of the task.
8) TaskWaitType: Indicates the event the task is waiting on.
9) TSQL: Actual SQL that is being run.
10) TotalPagesAllocated: This is sum of total pages allocated to the process. The higher number indicates the possibility of the process sucking the resources of the server.
You can also set up an automatic job that can look at this view and perform some logic based on process running time or TotalPagesAllocated.That would be a good way of automate monitoring of server.
I hope you have enjoyed reading this article. Please leave your comments . I will keep on improving my posts and will try to share good material.
This situation could happen when the server is running on low memory, high CPU usage or may be a process that is sucking all the server resources. I will present a query that will help monitor current SQL Server processes even when you can't bring up Activity Monitor and figure out what might be the cause of down of the problem. There have been a number of times that I couldn't bring up the activity monitor and use this query to figure out the SessionId(SPID) that is causing the problems to the SQL Server.
The following TSQL code queries the sys database and figure out the current processes on the SQL Server and also provides the total number of pages allocated to the process. You should sort it by total number of pages allocated (descending) to get the most expensive process running.
SELECT s.session_id AS 'SessionId',
s.login_name AS 'Login',
COALESCE(s.host_name, c.client_net_address) AS 'Host',
s.program_name AS 'Application',
t.task_state AS 'TaskState',
r.start_time AS 'TaskStartTime',
r.[status] AS 'TaskStatus',
r.wait_type AS 'TaskWaitType',
TSQL.[text] AS 'TSQL',
(
tsu.user_objects_alloc_page_count - tsu.user_objects_dealloc_page_count
) +(
tsu.internal_objects_alloc_page_count - tsu.internal_objects_dealloc_page_count
) AS 'TotalPagesAllocated'
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
WHERE (
tsu.user_objects_alloc_page_count - tsu.user_objects_dealloc_page_count
) +(
tsu.internal_objects_alloc_page_count - tsu.internal_objects_dealloc_page_count
) > 0;
I would suggest you wrap this query in a view and query the view using order by TotalPagesAllocated DESC. You can then KILL the SPID that is causing an issue or figure out where the problem is coming from. I will briefly discuss the columns returned by this query :
1)SessionID: The unique number assigned to a process connected to SQL Server. This is also called a SPID.
2) Login: The login to which the task is tied.
3) Host: The host from where the task is originated.
4) Application: The application that invokes this task.
5) TaskState: The current state of the task.
6) TaskStartTime: The time at which the task began.
7) TaskStatus: The current status of the task.
8) TaskWaitType: Indicates the event the task is waiting on.
9) TSQL: Actual SQL that is being run.
10) TotalPagesAllocated: This is sum of total pages allocated to the process. The higher number indicates the possibility of the process sucking the resources of the server.
You can also set up an automatic job that can look at this view and perform some logic based on process running time or TotalPagesAllocated.That would be a good way of automate monitoring of server.
I hope you have enjoyed reading this article. Please leave your comments . I will keep on improving my posts and will try to share good material.