1. Fabio Gentile
Premier Field Engineer
Microsoft
Fabricio Catae
Premier Field Engineer
Microsoft
SQL Server com Foco em
Diagnóstico de Desempenho
CÓDIGO DA SESSÃO: SUP-403
5. 7
Cenário: Alto Consumo de CPU
Utilizar o Task Manager
Identificar o processo
Usar DMV para identificar a causa do problema
Custo em CPU
Query rodando
Plano de execução
7. 9
Metodologia: Alto consumo de CPU
Confirmar alto consumo de CPU
Task Manager
Performance Monitor
Rodar a query sys.dm_exec_requests
Ordenar o resultado de acordo com cpu_time
Consultar o SQL Text usando o (sql) handle
Consultar o Query Plan usando o (plan) handle
9. 11
Redefinindo Performance
Performance (Desempenho)
Tempo de Resposta ao Usuário
Tamanho da Fila de Processamento
Utilização de Recursos
Sintomas de Baixo Desempenho
Alta Utilização de Recursos
Presença constante de 100% CPU
Alto consumo de Memória
Bloqueios e Locks entre Queries
10. 12
Análise do Consumo de CPU
Baseia-se no fato de que a THREAD possui dois
estados:
Rodando
Suspensa (Em Espera) CPU
CPU
Wait
12. 14
Wait Statistics
O que são Wait Statistics?
Sempre que uma query inicia a espera por algum
recurso (Disco, Locks, Rede), o SQL Server registra o
tipo e a duração desta espera
Estas informações sobre esperas são retidas e
permitem determinar porque a execução das queries é
mais lenta do que o esperado
13. 15
Wait Statistics
Por que usar Wait Statistics?
Abordagem inicial antes de aprofundar a análise de
performance usando outras ferramentas
Permite encontrar gargalos de performance que não
são óbvios e evita tentativas de eliminação de falsos
gargalos de performance
Permite identificar o maior retorno para os esforços de
ajuste de performance
14. 16
Wait Statistics
Onde encontrar Wait Statistics?
SQL Server DMV:
sys.dm_os_wait_stats
Wait Statistics são acumuladas desde o último restart
da instância do SQL Server, ou do último reset:
DBCC SQLPERF (‘sys.dm_os_wait_stats’, CLEAR)
15. 17
Wait Statistics
sys.dm_os_wait_stats
wait_type:
Tipo da espera
waiting_tasks_count:
Número de esperas deste tipo
wait_time_ms:
Tempo total de espera para este tipo em milissegundos
max_wait_time_ms:
Tempo máximo de espera para este tipo
signal_wait_time:
Diferença entre o tempo em que a espera teminou e o início da execução
17. 19
Wait Statistics
Interpretando Wait Types
Nem todos os wait types indicam problemas ou exigem
ações para serem corrigidos (como esperas associadas
a tarefas em background)
Concentre a análise em esperas por recursos que
podem indicar gargalos:
Disco
CPU
Memória
Locking
Rede
18. 20
Tarefas em Background e Esperas
Determinadas esperas (Wait Types) estão
relacionadas com tarefas que rodam em
background
Exemplo de tarefas de sistema:
FT_IFTS_SCHEDULER_IDLE_WAIT
REQUEST_FOR_DEADLOCK_SEARCH
SQLTRACE_BUFFER_FLUSH
LAZYWRITER_SLEEP
XE_TIMER_EVENT
CHECKPOINT_QUEUE
BROKER_TO_FLUSH
LOGMGR_QUEUE
20. 22
Cenário: Latência na Gravação do Log
Quando a thread espera por uma escrita no
arquivo de LOG, ela fica no modo de espera
Wait type: WRITELOG
Essa espera pode ser observada Online nas DMV
sys.dm_exec_requests
sys.dm_os_tasks
sys.dm_os_waiting_tasks
21. 23
WRITELOG
Gravação do LOG: 1ms
Escrita sequencial
Commit Transaction = 1 escrita em LOG
Limite de Transações/sec
22. 24
Recomendação
Garantir o tempo de acesso ao disco adequado
Ideal: < 1 ms (cache)
Bom: < 5 ms (normal)
...
Desastre Total: > 100 ms
Agrupar as transações excessivamente curtas
dentro de um contexto transacional
BEGIN TRANSACTION / COMMIT
24. 26
Cenário: Latência no Acesso aos Discos
Ocorre quando uma thread aguarda por uma
requisição de I/O num arquivo de dados
Wait type: PAGEIOLATCH_*
Esta espera pode ser observada nas DMVs:
sys.dm_os_wait_stats
sys.dm_exec_requests
sys.dm_os_tasks / sys.dm_os_waiting_tasks
sys.dm_io_pending_io_requests
27. 29
Recomendação
Garantir tempos de acesso adequados aos discos
(Physical Disk, Avg. Disk sec/Read e Avg. Disk
sec/Write)
Ideal: < 10 ms
Bom: < 20 ms
...
Ruim: > 100 ms
Diminuir a quantidade de leituras lógicas,
melhorando a estratégia de indexação
Database Engine Tuning Advisor (DTA)
sys.dm_db_missing_index_*
Plano de execução: Missing Index Details
29. 31
Breve Resumo
Wait Type Possível significado
PAGELATCH 2:*:* Contenção no TEMPDB em memória
PAGELATCH dbid:*:* Hot-spot em memória (page-split)
PAGEIOLATCH Leitura excessiva de disco
WRITELOG Escrita em disco de log
NETWORKIO Esperando recebimento de pacotes do cliente
SOS_SCHEDULER_YIELD Alto consumo de CPU
RESOURCE_SEMAPHORE Esperando por memória para Workspace
LCK_M_* Bloqueios
33. 35
Compatibilidade de Lock
S = Shared/Leitura ( múltiplas leituras )
X = Exclusivo ( bloqueia TODOS )
Intent Lock (IS, IX) – Compatíveis entre si
34. 36
Hierarquia de Locks
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
35. 37
Hierarquia de Locks (2)
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
Leitura da Tabela Inteira
TABLE LOCK S
PAGE LOCK -
ROW LOCK -
36. 38
Hierarquia de Locks (3)
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
Leitura de Linha
TABLE LOCK IS
PAGE LOCK IS
ROW LOCK S
37. 39
Recomendação
Matriz de Compatibilidade
Range Locks (LCK_M_R*)
Transação em Serializable
Utilize o NOLOCK se necessário
Melhor alternativa: Read Committed Snapshot
SQL tem lock de linha? (ROWLOCK)
Como usar um lock de linha se a query faz TABLE
SCAN?
38. 40
Referências – Wait Stats
SQL Server 2005 Waits and Queues:
http://technet.microsoft.com/en-us/library/cc966413.aspx
Troubleshooting Performance Problems in SQL Server 2005
http://technet.microsoft.com/en-us/library/cc966540.aspx
Troubleshooting Performance Problems in SQL Server 2008
http://technet.microsoft.com/en-us/library/dd672789(SQL.100).aspx
Description of the waittype and lastwaittype columns in the
master.dbo.sysprocesses table in SQL Server 2000 and SQL
Server 2005
http://support.microsoft.com/kb/822101
The SQL Server Wait Type Repository
http://blogs.msdn.com/b/psssql/archive/2009/11/03/the-sql-server-
wait-type-repository.aspx
select cpu = cpu_time, * from sys.dm_exec_requests
where group_id > 1
order by cpu_time desc
select text from sys.dm_exec_sql_text(0x02000000D328C61BD9377ECCC7A5C6E40A461B64C26643F2)
select * from sys.dm_exec_query_plan(0x06000D00D328C61B40C16D0F010000000000000000000000)
create index idxId on tbInfoRelation (id)
create index idxNextId on tbInfoRelation (nextid)
14/07/2010 4:47 PM
14/07/2010 4:47 PM
14/07/2010 4:47 PM
14/07/2010 4:47 PM
14/07/2010 4:47 PM
CREATE PROCEDURE procInsertInfo
AS
set nocount on
declare @i int = 0
declare @str char(10)
while @i<100000
begin
set @str = CAST(@i as CHAR(10))
insert tbInfo (info) values ( @str )
set @i = @i + 1
end
14/07/2010 4:47 PM
14/07/2010 4:47 PM
Analisar ConsultProximoIdRecentes
select * from (
select c1=t1.id, c2=t2.id from tbInfoRelation t1
inner join tbInfoRelation t2 on (t1.id = t2.nextid)
) tab
where c1+c2<10