Quantas vezes você já andou até um SQL Server que tem um problema de desempenho e se perguntou onde começar a procurar?

Uma das metodologias de resolução de problemas de desempenho mais sub-utilizados no mundo do SQL Server é um chamado “esperas e filas” (também conhecido simplesmente como “esperar estatísticas”). A premissa básica é que o SQL Server está permanentemente rastreamento por threads de execução tem que esperar. Você pode pedir SQL Server para obter essa informação e, em seguida, usar os resultados para diminuir, onde começar a cavar para desenterrar a causa de problemas de desempenho. Os “espera” são o que SQL faixas Server. Os “filas” são os recursos que os segmentos estão aguardando. Há uma infinidade de espera no sistema e todos eles indicam recursos diferentes que estão sendo esperado. Por exemplo, um PAGEIOLATCH_EX espera significa um fio está esperando por uma página de dados para ser lido na área de buffer do disco. Um LCK_M_X espera significa um segmento está aguardando para ser concedido um bloqueio exclusivo em algo.

A grande coisa sobre tudo isso é o SQL Server * sabe * onde os problemas de desempenho são, e você só precisa perguntar isso …. e, em seguida, interpretar o que ele diz, o que pode ser um pouco complicado.

Agora – onde as pessoas às vezes ficam penduradas está tentando rastrear cada última esperar e descobrir o que está causando isso. Waits * sempre * ocorrer. É a maneira sistema de agendamento do SQL Server funciona.

A thread está usando a CPU (chamado execução) até que ele precisa de esperar por um recurso. Ele então se move para uma lista não ordenada de segmentos que estão suspensos. Enquanto isso, a próxima linha no FIFO (first-in-first-out) da fila de segmentos de espera para a CPU (chamado sendo RUNNABLE) é dada a CPU e torna-se em execução. Se um segmento na lista SUSPENSA é notificado de que é recurso estiver disponível, torna-se RUNNABLE e é colocado na parte inferior da fila RUNNABLE. Threads continuar esse movimento no sentido horário a partir correndo para suspensas para RUNNABLE a correr novamente até que a tarefa seja concluída. Você pode ver processos nestes estados, utilizando as sys.dm_exec_requests DMV.

SQL Server mantém o controle do tempo Server 2016:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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',
        -- Maybe uncomment these four if you have mirroring issues
        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',
        -- Maybe uncomment these six if you have AG issues
        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'MEMORY_ALLOCATION_EXT',
        N'ONDEMAND_TASK_QUEUE',
        N'PREEMPTIVE_XE_GETTARGETSTATE',
        N'PWAIT_ALL_COMPONENTS_INITIALIZED',
        N'PWAIT_DIRECTLOGCONSUMER_GETNEXT',
        N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', N'QDS_ASYNC_QUEUE',
        N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
        N'QDS_SHUTDOWN_QUEUE', N'REDO_THREAD_PENDING_WORK',
        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_RECOVERY',
        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')
    AND [waiting_tasks_count] > 0
    )
SELECT
    MAX ([W1].[wait_type]) AS [WaitType],
    CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S],
    CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S],
    CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S],
    MAX ([W1].[WaitCount]) AS [WaitCount],
    CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage],
    CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S],
    CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S],
    CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S],
    CAST ('https://www.sqlskills.com/help/waits/' + MAX ([W1].[wait_type]) as XML) AS [Help/Info URL]
FROM [Waits] AS [W1]
INNER JOIN [Waits] AS [W2]
    ON [W2].[RowNum] <= [W1].[RowNum]
GROUP BY [W1].[RowNum]
HAVING SUM ([W2].[Percentage]) - MAX( [W1].[Percentage] ) < 95; -- percentage threshold
GO

Isto irá mostrar as esperas agrupados em conjunto como uma percentagem de todas as esperas no sistema, em ordem decrescente. O aguarda para se preocupar (potencialmente) são aqueles que estão no topo da lista, pois isso representa a maioria dos que o SQL Server está a gastar é o tempo de espera. Você pode ver que um monte de espera estão sendo filtrados fora de consideração – como eu disse acima, espera acontecem o tempo todo e estes são os benignos geralmente podemos ignorar.

Você também pode redefinir as estatísticas agregadas usando este código:

1
2
DBCC SQLPERF (N'sys.dm_os_wait_stats', CLEAR);
GO

fonte: http://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/ 

aa



Categorias:Programação

Tags:, , , , , , , ,

1 resposta

  1. I just like the helpful info you provide for your articles.
    I will bookmark your blog and check once more right here frequently.
    I am somewhat sure I will be informed many new stuff proper right here!
    Good luck for the next!

Deixe uma resposta

%d blogueiros gostam disto: