Подтвердить что ты не робот

Как узнать, что забивает мой SQL Server?

Мой процессор SQL Server составляет около 90% в течение большей части сегодняшнего дня.

Я не могу его перезапустить из-за постоянного использования.

Можно ли узнать, что внутри SQL вызывает такую ​​перегрузку процессора?

Я запустил SQL Profiler, но мне так сложно сказать, что что-то в нем вызывает.

Я запускал sp_who2, но не уверен, что все значит точно, и если здесь можно определить возможные проблемы.

Чтобы упредить любые ответы "это, вероятно, просто используется много", сегодня это только началось с совершенно нормальных уровней активности.

Я после любого способа найти то, что вызывает горе CPU в SQL.

4b9b3361

Ответ 1

Я предполагаю должную осмотрительность здесь, что вы подтвердили, что процессор фактически потребляется SQL-процессом (perfmon Счетчики категории продукта подтвердят это). Обычно для таких случаев вы берете образец соответствующих счетчиков производительности и сравниваете их с базовым уровнем, установленным в нормальных условиях эксплуатации. Как только вы решите эту проблему, я рекомендую вам установить такую ​​базовую линию для будущих сравнений.

Вы можете найти, где именно SQL тратит каждый отдельный цикл ЦП. Но зная, где искать, нужно много знать и опыт. Является ли SQL 2005/2008 или 2000? К счастью для 2005 года и новее есть пара решений для полки. У вас уже есть пара хороших указателей здесь с ответом Джона Самсона. Я хотел бы добавить рекомендацию по загрузке и установке Отчеты по производительности сервера SQL Server. Некоторые из этих отчетов включают в себя верхние запросы по времени или ввода-вывода, большинство используемых файлов данных и т.д., И вы можете быстро почувствовать, где проблема. Результат является как численным, так и графическим, поэтому он более полезен для новичка.

Я также рекомендовал бы использовать Adam Who Active script, хотя это немного более продвинутый.

И последнее, но не менее важное: я рекомендую вам загрузить и прочитать технический документ Консультативной группы MS SQL по анализу производительности: SQL 2005 Waits and Queues.

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

Ответ 2

В этом запросе используется DMV для определения наиболее дорогостоящих запросов с помощью CPU

SELECT TOP 20
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
        qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
        (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
        qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM
    sys.dm_exec_query_stats AS qs
CROSS APPLY 
    sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY
    sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY 
    qs.total_worker_time DESC

Полное описание: Как определить наиболее дорогостоящие запросы SQL Server по процессору

Ответ 3

Запустите любой из них на несколько секунд. Вы обнаружите высокое соединение с процессором. Или: хранящийся ЦП в локальной переменной WAITFOR DELAY, сравнивает сохраненные и текущие значения ЦП

select * from master..sysprocesses
where status = 'runnable' --comment this out
order by CPU
desc

select * from master..sysprocesses
order by CPU
desc

Не может быть самым элегантным, но эффективным и быстрым.

Ответ 4

Вы можете запустить SQL Profiler и фильтровать по CPU или Duration, чтобы исключить все "мелкие вещи". Тогда вам будет намного легче определить, есть ли у вас проблема, подобная определенной хранимой процедуре, которая работает намного дольше, чем она должна (может быть, отсутствующий индекс или что-то еще).

Два оговорки:

  • Если проблема представляет собой огромное количество крошечных транзакций, то фильтр, описанный выше, исключил бы их, и вы пропустите это.
  • Кроме того, если проблема представляет собой одно масштабное задание (например, 8-часовое аналитическое задание или плохо разработанный выбор, который должен пересекать миллиард строк), вы можете не видеть это в профилировщике, пока он не будет полностью в зависимости от того, какие события вы профилируете (sp: completed vs sp: statementcompleted).

Но обычно я начинаю с Activity Monitor или sp_who2.

Ответ 5

Для подхода с графическим интерфейсом я бы посмотрел на Activity Monitor под управлением и отсортировал по CPU.