Назад | Перейти на главную страницу

Как контролировать базу данных SQL Server?

У меня есть SQL Server 2008 с несколькими базами данных. ЦП на этом сервере загружается на 100% довольно много. Я хотел бы выяснить, какая база данных может вызывать это. Как это сделать проще всего?

Мой "волшебный" инструмент idal показал бы мне:

  1. ЦП, ОЗУ и ввод-вывод для SQL Server
  2. Разверните и покажите то же самое для каждой БД
  3. Разверните и покажите, какие запросы вызывают проблемы и т. Д.

Думаю, вы найдете ответ в одном из этих двух постов: 1, и 2.

Я предпочитаю использовать информацию из системного представления sys.dm_exec_query_stats. Монитор активности мне неудобен.

Чтобы получить информацию от sys.dm_exec_query_stats Я использую следующий сценарий, который я нашел Вот (к сожалению, на русском). Работает для SQL Server 2005+.

С помощью этого скрипта вы можете фильтровать или группировать запросы по нужным полям и, что более важно, получать информацию о времени последнего выполнения и объекте (SP, триггер), которому принадлежит запрос (Activity Monitor не предоставляет эту информацию).

Единственным недостатком сценария является то, что он возвращает совокупную статистику производительности только для кэшированных планов запросов. Если план удален из кеша по какой-либо причине (нехватка памяти, перекомпиляция), вы не увидите статистику по этому запросу.

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