5. Agenda
• DMVs
• CPU
• Memória
• Índices e Estatísticas
• IO
6. DMVs
• “Dynamic management views and functions
return server state information that can be used to
monitor the health of a server instance, diagnose
problems, and tune performance.” (Books Online)
8. CPU
select
scheduler_id,
current_tasks_count,
runnable_tasks_count -->Valor a verificar
from sys.dm_os_schedulers
where scheduler_id < 1048576
9. CPU
SELECT TOP 10
(total_worker_time * 1.0) / 1000000 AS Total_Worker_Time_in_Seconds,
execution_count,
((total_worker_time * 1.0) / 1000000) / execution_count AS Avg_Worker_Time_in_Seconds,
(min_worker_time * 1.0) / 1000000 AS Min_Worker_Time_in_Seconds,
(max_worker_time * 1.0) / 1000000 AS Max_Worker_Time_in_Seconds,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
order by total_worker_time desc
10. CPU
select top 25
sql_text.text,
plan_generation_num,
execution_count
from sys.dm_exec_query_stats a
cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
where plan_generation_num >1
order by plan_generation_num desc
11. CPU
select
timestamp,
convert(xml, record) as info
from sys.dm_os_ring_buffers
where ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
and record like '%<SystemHealth>%'
12. CPU
• Causas de bottleneck no CPU
– Estatísticas
– “WITH RECOMPILE” nas SPs
• OPTION (RECOMPILE)
– Paralelismo OPTION (MAXDOP) hint
15. Memória
SELECT
Getdate() report_time,
[cntr_value] as value_sec,
cast(@@SERVERNAME as varchar) as ServerName
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'
16. Memória
• Causas
– Configuração do SQL Server
– AWE inactivo (32 bits)
– Nº sessões activas
18. Índices e estatísticas
select
OBJECT_NAME(ps.object_id) as TableName
,si.Name ,ps.Avg_Fragmentation_in_percent
,STATS_DATE(ss.object_id,ss.stats_id) as LastUpdatedStatistics
from sys.dm_db_index_physical_stats(DB_ID(DB_NAME()),null,null,null,null) ps
join sysindexes si on ps.object_id = si.id
and ps.index_id = si.indid
left outer join sys.stats ss on ss.object_id = ps.object_id
and ss.name = si.name
where ps.avg_fragmentation_in_percent > 10
order by ps.avg_fragmentation_in_percent desc
19. Índices e estatísticas
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact , statement as TableName
, equality_columns , inequality_columns
, included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
20. Índices e estatísticas
SELECT TOP 10
DB_NAME() as DatabaseName , OBJECT_NAME(s.[object_id]) as TableName ,
IndexName = i.name,
user_updates, system_updates
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
WHERE s.database_id = DB_ID()
AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
AND user_seeks = 0 AND user_scans = 0 AND user_lookups = 0
AND i.name IS NOT NULL -- Ignore HEAP indexes.
ORDER BY user_updates DESC
21. Índices e estatísticas
• Causas
– Muitos inserts, updates e deletes
– Plano manutenção ineficaz
– Excesso ou falta de índices
– Shrink
23. IO
SELECT DB_NAME(fs.database_id) AS [Database Name], mf.physical_name, io_stall_read_ms, num_of_reads,
CAST(io_stall_read_ms/(1.0 + num_of_reads) AS NUMERIC(10,1)) AS [avg_read_stall_ms],io_stall_write_ms,
num_of_writes,CAST(io_stall_write_ms/(1.0+num_of_writes) AS NUMERIC(10,1)) AS [avg_write_stall_ms],
io_stall_read_ms + io_stall_write_ms AS [io_stalls], num_of_reads + num_of_writes AS [total_io],
CAST((io_stall_read_ms + io_stall_write_ms)/(1.0 + num_of_reads + num_of_writes) AS NUMERIC(10,1))
AS [avg_io_stall_ms]
FROM sys.dm_io_virtual_file_stats(null,null) AS fs
INNER JOIN sys.master_files AS mf
ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]
ORDER BY avg_io_stall_ms DESC OPTION (RECOMPILE);
24. IO
Select wait_type,
waiting_tasks_count,
wait_time_ms / 1000 as wait_time_in_sec
from sys.dm_os_wait_stats
where wait_type like 'PAGEIOLATCH%'
order by wait_type
25. IO
• tempDB
• Índices
• Recolha excessiva de dados
• Base de dados com problemas no schema
• Pouca memória
30. Próximas reuniões presenciais
• 24/09/2011 – Setembro (2 anos!)
• 29/10/2011 – Outubro
• 19/11/2011 – Outubro (Coimbra)
• 26/11/2011 – Novembro
Reserva estes dias na agenda! :)
VIEW SERVER STATE or VIEW DATABASE STATE permissionServer-scope e Database-scope
Se os valores se mantiverem altos com frequência pode ser sinal de CPU bottleneck.Runnable_tasks_count : nº de querys a aguardar pelo processador
Atenção que a DMV sys.dm_exec_query_stats pode dar resultados incorretos quando o servidor está em cargaVamos analisar as querys que correm menos vezes e com tempos muito altos ou as que correm muitas vezes e com tempos relativamente baixos
Plan_generation_num indica o nº de vezes que a query foi recompiladaRazões: alterações de schema, alguns SET options e alterações nos dados das tabelas utilizadas