SQL Server Wait -Queries

Check waits stats against the database

use DGI_450

select * from sys.dm_os_waiting_tasks where session_id in (select session_id from sys.dm_exec_requests where  database_id = db_id())

 

Create table  msdb.dbo.waiting_stats  and Insert Wait stat data in table .

CREATE TABLE [dbo].[waiting_stats](

    [timestamp] [datetime] NOT NULL,

    [dbid] [int] NULL,

    [waiting_task_address] [varbinary](8) NOT NULL,

    [session_id] [smallint] NULL,

    [exec_context_id] [int] NULL,

    [wait_duration_ms] [bigint] NULL,

    [wait_type] [nvarchar](60) NULL,

    [resource_address] [varbinary](8) NULL,

    [blocking_task_address] [varbinary](8) NULL,

    [blocking_session_id] [smallint] NULL,

    [blocking_exec_context_id] [int] NULL,

    [resource_description] [nvarchar](1024) NULL

) ON [PRIMARY]

CREATE TABLE [dbo].[OverallWaitsOnServer](

    [logtime] [datetime] NULL,

    [wait_type] [nvarchar](60) NOT NULL,

    [waiting_tasks_count] [bigint] NOT NULL,

    [wait_time_ms] [bigint] NOT NULL,

    [max_wait_time_ms] [bigint] NOT NULL,

    [signal_wait_time_ms] [bigint] NOT NULL

) ON [PRIMARY]

use DGI_450

 select  getdate()timestamp,* into msdb.dbo.waiting_stats from sys.dm_os_waiting_tasks where session_id in (select session_id from sys.dm_exec_requests where database_id = db_id())

Query  Insert the data wait stat and table count every 1 min .

 declare @datefilter datetime

set @datefilter = dateadd(hh, 1,getdate())

--print @datefilter

while (getdate() <= @datefilter)

begin

      insert into msdb.dbo.T_CTRL_FILE_ERROR_DETAIL_temp select getdate(), count(*) from DGI_450_PROD_R_4_4..T_CTRL_FILE_ERROR_DETAIL with (nolock)

     insert into msdb.dbo.waiting_stats select getdate(),* from sys.dm_os_waiting_tasks where session_id in (select session_id from sys.dm_exec_requests where database_id = db_id())

       waitfor delay '000:00:56'

end

-----------------------------------------------------------------

Query  Insert the data wait stat and table count every 1 min .

DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);

declare @datefilter datetime, @Counter int

set @Counter = 0

set @datefilter = dateadd(hh, 1,getdate())

if (datepart(hh, getdate()) = 6 and (datepart(mi, getdate()) between 25 and 35))

    set @datefilter = dateadd(hh, 2,getdate())

print @datefilter

while (getdate() <= @datefilter)

begin

    insert into msdb.dbo.waiting_stats

    select getdate(), er.database_id, wt.* from sys.dm_os_waiting_tasks wt

        join sys.dm_exec_requests er

                on wt.session_id = er.session_id

        where wait_duration_ms > 0

             and wt.wait_type not in ( 'WAITFOR', 'TRACEWRITE')

       

    if (@Counter%2 = 0)

        insert into msdb.dbo.OverallWaitsOnServer

            select Getdate(), *  from sys.dm_os_wait_stats

                where waiting_tasks_count > 0 and wait_time_ms > 0

                    and max_wait_time_ms > 0 and signal_wait_time_ms > 0

    set @Counter = @Counter + 1

    waitfor delay '000:00:05'

end

----------------------------------------------------------------------------

   This query gives you an idea of what is going on with your server right now..

DECLARE @OpenQueries TABLE (cpu_time INT, logical_reads INT, session_id INT)

INSERT INTO @OpenQueries(cpu_time, logical_reads, session_id)

select r.cpu_time ,r.logical_reads, r.session_id

from sys.dm_exec_sessions as s inner join sys.dm_exec_requests as r

on s.session_id =r.session_id and s.last_request_start_time=r.start_time

where is_user_process = 1

and s.session_id <> @@SPID

waitfor delay '00:00:01'

select substring(h.text, (r.statement_start_offset/2)+1 , ((case r.statement_end_offset when -1 then datalength(h.text)  else r.statement_end_offset end - r.statement_start_offset)/2) + 1) as text

, r.cpu_time-t.cpu_time as CPUDiff

, r.logical_reads-t.logical_reads as ReadDiff

, r.wait_type

, r.wait_time

, r.last_wait_type

, r.wait_resource

, r.command

, r.database_id

, r.blocking_session_id

, r.granted_query_memory

, r.session_id

, r.reads

, r.writes, r.row_count, s.[host_name]

, s.program_name, s.login_name

from sys.dm_exec_sessions as s inner join sys.dm_exec_requests as r

on s.session_id =r.session_id and s.last_request_start_time=r.start_time

left join @OpenQueries as t on t.session_id=s.session_id

CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) h

where is_user_process = 1

and s.session_id <> @@SPID

order by 3 desc

-------------------------------------------------------------------------------------------------------------------------------------------

SQL Server for the cumulative wait statistics using the sys.dm_os_wait_stats DMV,

This will show the waits grouped together as a percentage of all waits on the system, in decreasing order. The waits to be concerned about (potentially) are those at the top of the list as this represents the majority of where SQL Server is spending it’s time waiting. You can see that a bunch of waits are being filtered out

-------------------------------------------------------------------------------------------------------------------------------------------

WITH [Waits] AS

    (SELECT

        [wait_type],[wait_time_ms] / 1000.0 AS [WaitS],([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],                                 [signal_wait_time_ms] / 1000.0 AS [SignalS],[waiting_tasks_count] AS [WaitCount],100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] FROM sys.dm_os_wait_stats

    WHERE [wait_type] NOT IN (

        N'CLR_SEMAPHORE',    N'LAZYWRITER_SLEEP',

        N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',

        N'SLEEP_TASK',       N'SLEEP_SYSTEMTASK',

        N'WAITFOR',          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',

        N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',

        N'XE_TIMER_EVENT',   N'XE_DISPATCHER_JOIN',

        N'LOGMGR_QUEUE',     N'FT_IFTS_SCHEDULER_IDLE_WAIT',

        N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',

        N'CLR_AUTO_EVENT',   N'DISPATCHER_QUEUE_SEMAPHORE',

        N'TRACEWRITE',       N'XE_DISPATCHER_WAIT',

        N'BROKER_TO_FLUSH',  N'BROKER_EVENTHANDLER',

        N'FT_IFTSHC_MUTEX',  N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',

        N'DIRTY_PAGE_POLL',  N'SP_SERVER_DIAGNOSTICS_SLEEP')

    )

SELECT

    [W1].[wait_type] AS [WaitType], CAST ([W1].[WaitS] AS DECIMAL(14, 2)) AS [Wait_S],CAST ([W1].[ResourceS] AS DECIMAL(14, 2)) AS [Resource_S],        CAST([W1].[SignalS] AS DECIMAL(14, 2)) AS [Signal_S],[W1].[WaitCount] AS [WaitCount],CAST ([W1].[Percentage] AS DECIMAL(4, 2)) AS [Percentage],CAST (([W1].[WaitS] / [W1].[WaitCount]) AS DECIMAL (14, 4)) AS [AvgWait_S],CAST (([W1].[ResourceS] / [W1].[WaitCount]) AS DECIMAL (14, 4)) AS [AvgRes_S], CAST (([W1].[SignalS] / [W1].[WaitCount]) AS DECIMAL (14, 4)) AS [AvgSig_S] FROM [Waits] AS [W1]

INNER JOIN [Waits] AS [W2]

    ON [W2].[RowNum] <= [W1].[RowNum]

GROUP BY [W1].[RowNum], [W1].[wait_type], [W1].[WaitS],

    [W1].[ResourceS], [W1].[SignalS], [W1].[WaitCount], [W1].[Percentage]

HAVING SUM ([W2].[Percentage]) - [W1].[Percentage] < 95; -- percentage threshold

GO

-------------------------------------------------------------------------------------------------------------------

--<<<<<<<<<<----------------------------------------------------------------->>>>>>>>>>-- --DMV_All-Stars.sql         --http://blogs.msdn.com/jimmymay --Table of Contents --1. expensive queries --2. wait stats --3. virtual file stats (& virtual file latency) --4. plan cache interrogation --5. real-time blockers --<<<<<<<<<<----------------------------------------------------------------->>>>>>>>>>-- --Weasel Clause: This script is provided "AS IS" with no warranties, and confers no rights. --  Use of included script samples are subject to the terms specified at --  http://www.microsoft.com/info/cpyright.htm --<<<<<<<<<<----------------------------------------------------------------->>>>>>>>>>--  --1. expensive queries     --text *and* statement     --usage: modify WHERE & ORDER BY clauses to suit circumstances SELECT --TOP 25       -- the following four columns are NULL for ad hoc and prepared batches       DB_Name(qp.dbid) as dbname , qp.dbid , qp.objectid , qp.number     --, qp.query_plan --the query plan can be *very* useful; enable if desired     , qt.text     , SUBSTRING(qt.text, (qs.statement_start_offset/2) + 1,         ((CASE statement_end_offset             WHEN -1 THEN DATALENGTH(qt.text)             ELSE qs.statement_end_offset END                 - qs.statement_start_offset)/2) + 1) as statement_text     , qs.creation_time , qs.last_execution_time , qs.execution_count     , qs.total_worker_time    / qs.execution_count as avg_worker_time     , qs.total_physical_reads / qs.execution_count as avg_physical_reads     , qs.total_logical_reads  / qs.execution_count as avg_logical_reads     , qs.total_logical_writes / qs.execution_count as avg_logical_writes     , qs.total_elapsed_time   / qs.execution_count as avg_elapsed_time     , qs.total_clr_time       / qs.execution_count as avg_clr_time     , qs.total_worker_time , qs.last_worker_time , qs.min_worker_time , qs.max_worker_time     , qs.total_physical_reads , qs.last_physical_reads , qs.min_physical_reads , qs.max_physical_reads     , qs.total_logical_reads , qs.last_logical_reads , qs.min_logical_reads , qs.max_logical_reads     , qs.total_logical_writes , qs.last_logical_writes , qs.min_logical_writes , qs.max_logical_writes     , qs.total_elapsed_time , qs.last_elapsed_time , qs.min_elapsed_time , qs.max_elapsed_time     , qs.total_clr_time , qs.last_clr_time , qs.min_clr_time , qs.max_clr_time     --, qs.sql_handle , qs.statement_start_offset , qs.statement_end_offset     , qs.plan_generation_num     , qp.encrypted     , qp.query_plan     FROM sys.dm_exec_query_stats as qs     CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) as qp     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt     --WHERE last_execution_time >= '20130264'     --ORDER BY qs.execution_count      DESC  --Frequency       ORDER BY qs.total_worker_time    DESC  --CPU     --ORDER BY qs.total_elapsed_time   DESC  --Durn     --ORDER BY qs.total_logical_reads  DESC  --Reads     --ORDER BY qs.total_logical_writes DESC  --Writes     --ORDER BY qs.total_physical_reads DESC  --PhysicalReads     --ORDER BY avg_worker_time         DESC  --AvgCPU     --ORDER BY avg_elapsed_time        DESC  --AvgDurn     --ORDER BY avg_logical_reads       DESC  --AvgReads     --ORDER BY avg_logical_writes      DESC  --AvgWrites     --ORDER BY avg_physical_reads      DESC  --AvgPhysicalReads      --sample WHERE clauses     --WHERE last_execution_time > '20070507 15:00'     --WHERE execution_count = 1     --  WHERE SUBSTRING(qt.text, (qs.statement_start_offset/2) + 1,     --    ((CASE statement_end_offset     --        WHEN -1 THEN DATALENGTH(qt.text)     --        ELSE qs.statement_end_offset END     --            - qs.statement_start_offset)/2) + 1)     --      LIKE '%MyText%'  --<<<<<<<<<<----------------------------------------------------------------->>>>>>>>>>-- --2. wait stats --DBCC sqlperf(waitstats) --DBCC sqlperf('sys.dm_os_wait_stats',CLEAR)  --re-initialize waitstats SELECT * , (wait_time_ms - signal_wait_time_ms) as resource_wait_time_ms          , signal_wait_time_per_wait              = CASE WHEN waiting_tasks_count = 0                     THEN 0 ELSE (signal_wait_time_ms/waiting_tasks_count) END          , resource_wait_time_per_wait              = CASE WHEN waiting_tasks_count = 0                     THEN 0 ELSE ((wait_time_ms - signal_wait_time_ms)/waiting_tasks_count) END     FROM sys.dm_os_wait_stats     ORDER BY resource_wait_time_ms DESC     --ORDER BY wait_time_ms DESC     --ORDER BY signal_wait_time_ms DESC     --ORDER BY waiting_tasks_count DESC     --ORDER BY max_wait_time_ms DESC  --adapted from Paul Randal     --Wait statistics, or please tell me where it hurts     --http://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts ;WITH Waits AS      (SELECT          wait_type,          wait_time_ms / 1000.0 AS WaitS,          (wait_time_ms - signal_wait_time_ms) / 1000.0 AS ResourceS,          signal_wait_time_ms / 1000.0 AS SignalS,          waiting_tasks_count AS WaitCount,          100.0 * wait_time_ms / SUM (wait_time_ms) OVER() AS Percentage,          ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS RowNum       FROM sys.dm_os_wait_stats       WHERE wait_type NOT IN         ( N'BROKER_EVENTHANDLER',             N'BROKER_RECEIVE_WAITFOR',    N'BROKER_TASK_STOP',                N'BROKER_TO_FLUSH',           N'BROKER_TRANSMITTER',              N'CHECKPOINT_QUEUE',          N'CHKPT',                           N'CLR_AUTO_EVENT',           N'CLR_MANUAL_EVENT',                N'CLR_SEMAPHORE',             N'DBMIRROR_DBM_EVENT',              N'DBMIRROR_EVENTS_QUEUE',           N'DBMIRROR_WORKER_QUEUE',           N'DBMIRRORING_CMD',           N'DIRTY_PAGE_POLL',                 N'DISPATCHER_QUEUE_SEMAPHORE',           N'EXECSYNC',                        N'FSAGENT',                   N'FT_IFTS_SCHEDULER_IDLE_WAIT',     N'FT_IFTSHC_MUTEX',           N'HADR_CLUSAPI_CALL',               N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',           N'HADR_LOGCAPTURE_WAIT',            N'HADR_NOTIFICATION_DEQUEUE', N'HADR_TIMER_TASK',                 N'HADR_WORK_QUEUE',           N'KSOURCE_WAKEUP',                  N'LAZYWRITER_SLEEP',          N'LOGMGR_QUEUE',                    N'ONDEMAND_TASK_QUEUE',           N'PWAIT_ALL_COMPONENTS_INITIALIZED',                              N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',           N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',                N'REQUEST_FOR_DEADLOCK_SEARCH',     N'RESOURCE_QUEUE',           N'SERVER_IDLE_CHECK',               N'SLEEP_BPOOL_FLUSH',         N'SLEEP_DBSTARTUP',                 N'SLEEP_DCOMSTARTUP',           N'SLEEP_MASTERDBREADY',             N'SLEEP_MASTERMDREADY',       N'SLEEP_MASTERUPGRADED',            N'SLEEP_MSDBSTARTUP',           N'SLEEP_SYSTEMTASK',                N'SLEEP_TASK',                N'SLEEP_TEMPDBSTARTUP',             N'SNI_HTTP_ACCEPT',           N'SP_SERVER_DIAGNOSTICS_SLEEP',     N'SQLTRACE_BUFFER_FLUSH',     N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',           N'SQLTRACE_WAIT_ENTRIES',           N'WAIT_FOR_RESULTS',          N'WAITFOR',                         N'WAITFOR_TASKSHUTDOWN',           N'WAIT_XTP_HOST_WAIT',              N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',           N'WAIT_XTP_CKPT_CLOSE',             N'XE_DISPATCHER_JOIN',        N'XE_DISPATCHER_WAIT',              N'XE_TIMER_EVENT'         )      )  SELECT TOP 10      W1.wait_type AS WaitType,      CAST (W1.Percentage AS DECIMAL(4, 2)) AS Percentage,      CAST (W1.WaitS AS DECIMAL(14, 2)) AS Wait_Sec,      CAST (W1.ResourceS AS DECIMAL(14, 2)) AS Resource_Sec,      CAST (W1.SignalS AS DECIMAL(14, 2)) AS Signal_Sec,      W1.WaitCount AS WaitCount,      CAST ((W1.WaitS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgWait_Sec,      CAST ((W1.ResourceS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgRes_Sec,      CAST ((W1.SignalS / W1.WaitCount) AS DECIMAL (14, 4)) AS AvgSig_Sec  FROM Waits AS W1      INNER JOIN Waits AS W2 ON W2.RowNum <= W1.RowNum  GROUP BY W1.RowNum, W1.wait_type, W1.WaitS, W1.ResourceS, W1.SignalS, W1.WaitCount, W1.Percentage  HAVING SUM (W2.Percentage) - W1.Percentage < 99.9; -- percentage threshold   GO  --<<<<<<<<<<----------------------------------------------------------------->>>>>>>>>>-- --3. virtual file stats SELECT     --virtual file latency     vReadLatency         = CASE WHEN num_of_reads = 0                THEN 0 ELSE (io_stall_read_ms/num_of_reads) END   , vWriteLatency        = CASE WHEN num_of_writes = 0               THEN 0 ELSE (io_stall_write_ms/num_of_writes) END   , vLatency       = CASE WHEN (num_of_reads = 0 AND num_of_writes = 0)              THEN 0 ELSE (io_stall/(num_of_reads + num_of_writes)) END   --avg bytes per IOP   , BytesperRead         = CASE WHEN num_of_reads = 0                THEN 0 ELSE (num_of_bytes_read/num_of_reads) END   , BytesperWrite        = CASE WHEN num_of_writes = 0               THEN 0 ELSE (num_of_bytes_written/num_of_writes) END   , BytesperTransfer       = CASE WHEN (num_of_reads = 0 AND num_of_writes = 0)              THEN 0 ELSE ((num_of_bytes_read+num_of_bytes_written)/(num_of_reads + num_of_writes)) END    , LEFT(mf.physical_name,2) as Drive   , DB_NAME(vfs.database_id) as DB   --, mf.name AS FileName   , vfs.*   , mf.physical_name   FROM sys.dm_io_virtual_file_stats(NULL,NULL) as vfs     JOIN sys.master_files as mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id   --WHERE mf.type_desc = 'LOG' -- log files   --WHERE DB_NAME(vfs.database_id) IN ('tpcc','tpcc2')   ORDER BY vLatency DESC   -- ORDER BY vReadLatency DESC   -- ORDER BY vWriteLatency DESC --<<<<<<<<<<----------------------------------------------------------------->>>>>>>>>>-- --4. plan cache interrogation -- note: sys.dm_exec_cached_plans is diminutive version of syscacheobjects     -- no dbid, setopts -- we want reusable code, absence of ad hoc SQL -- we want relatively few rows with low usecounts --2000 SELECT cacheobjtype , objtype , usecounts , pagesused , dbid , sql     FROM master.dbo.syscacheobjects     WHERE cacheobjtype = 'Compiled Plan'     ORDER BY usecounts DESC     --ORDER BY sql --2005 SELECT c.cacheobjtype , c.objtype , c.usecounts , c.size_in_bytes , t.dbid , t.text     FROM sys.dm_exec_cached_plans as c         CROSS APPLY sys.dm_exec_sql_text(plan_handle) as t     WHERE c.cacheobjtype = 'Compiled Plan'     ORDER BY c.usecounts DESC     --ORDER BY t.text  --<<<<<<<<<<----------------------------------------------------------------->>>>>>>>>>-- --5. real-time blockers     --Report Blocker and Waiter SQL Statements     --http://www.microsoft.com/technet/scriptcenter/scripts/sql/sql2005/trans/sql05vb044.mspx?mfr=true     -- SQLCAT BPT SELECT     t1.resource_type as lock_type   , db_name(resource_database_id) as DB   , t1.resource_associated_entity_id as blkd_obj   , t1.request_mode as lock_req          -- lock requested   , t1.request_session_id as waiter_sid-- spid of waiter   , t2.wait_duration_ms as waittime   , (SELECT text FROM sys.dm_exec_requests as r  --- get sql for waiter         CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)             WHERE r.session_id = t1.request_session_id) as waiter_batch   , (SELECT SUBSTRING(qt.text , r.statement_start_offset/2           , (CASE WHEN r.statement_end_offset = -1                 THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2                 ELSE r.statement_end_offset END - r.statement_start_offset)/2)         FROM sys.dm_exec_requests as r             CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) as qt             WHERE r.session_id = t1.request_session_id) as waiter_stmt    --- this is the statement executing right now    , t2.blocking_session_id as blocker_sid -- spid of blocker    , (SELECT text FROM sys.sysprocesses as p       --- get sql for blocker             CROSS APPLY sys.dm_exec_sql_text(p.sql_handle)             WHERE p.spid = t2.blocking_session_id) as blocker_stmt FROM sys.dm_tran_locks as t1     JOIN sys.dm_os_waiting_tasks as t2         ON t1.lock_owner_address = t2.resource_address   

 

https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/09/02/58/12/DMV_All-Stars_v20150114.sql

-------------------------------------------------------------------------------------------------------