1) Blocked And Blocking queries.
If this query returns no rows you have no blocked queries in this moment. Run it more then once to see any few-seconds blocking queries. NOTE: This exclude ONLY problems with long-locking running queries. Cumulative short-term locking contentions need other kinds of debug (see point 2)
SELECT 'BLOCKING STATUS' as Controllo, BlockedSPID=left(blocked.session_id,5) , BlockedQuery=convert(varchar(50),blockedsql.text), BlockingSPID=convert(varchar(50),blocking.session_id), BlockingQuery=convert(varchar(50),blockingsql.text) FROM sys.dm_exec_requests blocked JOIN sys.dm_exec_requests blocking ON blocked.blocking_session_id = blocking.session_id CROSS APPLY ( SELECT * FROM sys.dm_exec_sql_text(blocked.sql_handle) ) blockedsql CROSS APPLY ( SELECT * FROM sys.dm_exec_sql_text(blocking.sql_handle) ) blockingsql GO
2) Time-Wait analysis
SQL Server collects informations about time wait events of your instance for every session. Every event (IO,CPU Processing,Locking and so on) is collected and showed in some dynamic management views from instance start/restart. To see what’s heppening now you can reset one af this views and collect for a short time windows events details for debug purpose. To understand the meaning of every SQL Wait Events see: http://msdn.microsoft.com/it-it/library/ms179984.aspx.
Following you can see a good wait analysis script to cross informations for a fast debug (source: http://www.sqlskills.com/blogs/paul/advanced-performance-troubleshooting-waits-latches-spinlocks/)
DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR); --reset DM view GO SELECT [owt].[session_id], [owt].[exec_context_id], [owt].[wait_duration_ms], [owt].[wait_type], [owt].[blocking_session_id], [owt].[resource_description], [es].[program_name], [est].1, [est].[dbid], [eqp].[query_plan], [es].[cpu_time], [es].[memory_usage] FROM sys.dm_os_waiting_tasks [owt] INNER JOIN sys.dm_exec_sessions [es] ON [owt].[session_id] = [es].[session_id] INNER JOIN sys.dm_exec_requests [er] ON [es].[session_id] = [er].[session_id] OUTER APPLY sys.dm_exec_sql_text ([er].[sql_handle]) [est] OUTER APPLY sys.dm_exec_query_plan ([er].[plan_handle]) [eqp] WHERE [es].[is_user_process] = 1 ORDER BY [owt].[session_id], [owt].[exec_context_id]; GO
3) Open transactions with plan and sql texts
It’s really simple to see informations about current sessions using the old and trusty exec sp_who2 or the dynamic management view sys.dm_exec_requests
But if you need exactly what statements are running and wich plan are they using you need a more complicate query.
This is a good script from http://www.sqlskills.com/blogs/paul/script-open-transactions-with-text-and-plans/ useful to see current transactions with detailed informations about every sessions running.
SELECT s_tst.[session_id], s_es.[login_name] AS [Login Name], DB_NAME (s_tdt.database_id) AS [Database], s_tdt.[database_transaction_begin_time] AS [Begin Time], s_tdt.[database_transaction_log_record_count] AS [Log Records], s_tdt.[database_transaction_log_bytes_used] AS [Log Bytes], s_tdt.[database_transaction_log_bytes_reserved] AS [Log Rsvd], s_est. AS [Last T-SQL Text], s_eqp.[query_plan] AS [Last Plan] FROM sys.dm_tran_database_transactions s_tdt JOIN sys.dm_tran_session_transactions s_tst ON s_tst.[transaction_id] = s_tdt.[transaction_id] JOIN sys.[dm_exec_sessions] s_es ON s_es.[session_id] = s_tst.[session_id] JOIN sys.dm_exec_connections s_ec ON s_ec.[session_id] = s_tst.[session_id] LEFT OUTER JOIN sys.dm_exec_requests s_er ON s_er.[session_id] = s_tst.[session_id] CROSS APPLY sys.dm_exec_sql_text (s_ec.[most_recent_sql_handle]) AS s_est OUTER APPLY sys.dm_exec_query_plan (s_er.[plan_handle]) AS s_eqp ORDER BY [Begin Time] ASC; GO