Como monitorar o banco de dados do SQL Server?

2

Eu tenho o SQL Server 2008 com vários bancos de dados. CPU chega até 100% nesse servidor bastante. Eu gostaria de descobrir qual banco de dados pode estar causando isso. Qual é a maneira mais fácil de fazer isso?

Minha ferramenta idal "mágica" me mostraria:

  1. CPU, RAM e E / S para o SQL Server
  2. Detalhar e mostrar o mesmo para cada DB
  3. Pesquise e mostre quais consultas estão causando problemas, etc.
por katit 09.12.2011 / 17:29

2 respostas

0

Eu prefiro usar as informações da exibição do sistema sys.dm_exec_query_stats . O monitor de atividades é inconveniente para mim.

Para obter informações de sys.dm_exec_query_stats eu uso o seguinte script que eu encontrei aqui (infelizmente é em russo ). Funciona para o SQL Server 2005 +.

Usando esse script, você pode filtrar ou agrupar consultas pelos campos desejados e, o que é mais importante, obter informações sobre o último tempo de execução e objeto (SP, disparador) ao qual a consulta pertence (Activity Monitor não fornece essas informações ).

A única desvantagem do script é que ele retorna estatísticas de desempenho agregadas somente para planos de consulta em cache. Se um plano for removido do cache por qualquer motivo (falta de memória, recompilação), você não verá estatísticas para essa consulta.

set transaction isolation level read uncommitted
select 
    top 100
    creation_time,
    last_execution_time,
    execution_count,
    total_worker_time/1000 as CPU,
    convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
    qs.total_elapsed_time/1000 as TotDuration,
    convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
    total_logical_reads as [Reads],
    total_logical_writes as [Writes],
    total_logical_reads+total_logical_writes as [AggIO],
    convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
    case 
        when sql_handle IS NULL then ' '
        else(substring(st.text,(qs.statement_start_offset+2)/2,(
            case
                when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2      
                else qs.statement_end_offset    
            end - qs.statement_start_offset)/2  ))
    end as query_text,
    db_name(st.dbid)as database_name,
    object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as object_name
from sys.dm_exec_query_stats  qs
cross apply sys.dm_exec_sql_text(sql_handle) st
where total_logical_reads > 0
order by AvgDur desc
    
por 11.12.2011 / 14:33
1

Acho que você encontrará sua resposta em uma dessas duas postagens: 1 e 2 .

    
por 09.12.2011 / 17:42