Выявление проблем производительности SQL Server

У нас возникают спорадические, случайные тайм-ауты запросов в нашем кластере SQL Server 2005. У меня есть несколько приложений, которые его используют, поэтому я помогаю в расследовании. Наблюдая за% процессорного времени в обычном старом Perfmon, вы определенно можете увидеть, как оно сокращается. Однако монитор активности SQL дает только совокупное время ЦП и ввода-вывода, используемое процессом, а не то, что он использует в данный момент или за определенный период времени. Возможно, я мог бы использовать профилировщик и запустить трассировку, но этот кластер очень интенсивно используется, и я боюсь, что буду искать иголку в стоге сена. Я лаю не на то дерево?

Есть ли у кого-нибудь хорошие методы для отслеживания дорогостоящих запросов / процессов в этой среде?

Ответов (7)

Решение

Это даст вам 50 лучших операторов по среднему времени ЦП, проверьте здесь другие сценарии: http://www.microsoft.com/technet/scriptcenter/scripts/sql/sql2005/default.mspx?mfr=true

SELECT TOP 50
        qs.total_worker_time/qs.execution_count as [Avg CPU Time],
        SUBSTRING(qt.text,qs.statement_start_offset/2, 
            (case when qs.statement_end_offset = -1 
            then len(convert(nvarchar(max), qt.text)) * 2 
            else qs.statement_end_offset end -qs.statement_start_offset)/2) 
        as query_text,
        qt.dbid, dbname=db_name(qt.dbid),
        qt.objectid 
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY 
        [Avg CPU Time] DESC

Запустите Profiler и отфильтруйте запросы, для которых требуется больше определенного количества чтений. Для приложения, над которым я работал, любой запрос без отчетов, потребовавший более 5000 чтений, заслуживает второго рассмотрения. У вашего приложения может быть другой порог, но идея та же.

Как говорит Яаков, запустите профилировщик на несколько минут при типичной нагрузке и сохраните результаты в таблице, которая позволит вам выполнять запросы к результатам, что значительно упрощает обнаружение любых запросов, потребляющих ресурсы.

Мы используем продукт Quest's Spotlight . Очевидно, что это вложение времени и денег, поэтому это может не помочь вам в краткосрочной перспективе, но если у вас большая среда SQL, это очень полезно.

Эта утилита от Эрланда Соммарскога очень полезна.

Это хранимая процедура, которую вы добавляете в свою базу данных. Запускайте его всякий раз, когда вы хотите увидеть, какие запросы активны, и получить хорошее представление о блокировках, блокировках и т. Д. Я использую его регулярно, когда все кажется запутанным.

Profiler может показаться подходом «иголка в стоге сена», но он может оказаться полезным. Попробуйте запустить его на пару минут, пока базы данных находятся под обычной нагрузкой, и посмотрите, не выделяются ли какие-либо запросы как занимающие слишком много времени или каким-то образом ресурсы. Хотя подобная ситуация может указывать на некоторую общую проблему, она также может быть связана с какой-то конкретной проблемой с одним или двумя сайтами, которые при определенных обстоятельствах приводят к очень плохой производительности.

Я считаю, что отчеты панели мониторинга производительности очень полезны. Они представляют собой набор настраиваемых отчетов RS, предоставляемых Microsoft. Вам просто нужно запустить установщик на своем клиентском ПК, а затем запустить setup.sql на экземпляре SQL Server.

После этого щелкните правой кнопкой мыши базу данных (неважно какую) в SSMS и перейдите в Отчеты -> Пользовательские отчеты. Найдите и выберите файл performance_dashboard_main.rdl, который по умолчанию находится в папке \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ PerformanceDashboard. Вам нужно сделать это только один раз. После первого раза он появится в списке отчетов.

На главной панели мониторинга, среди прочего, будет отображаться загрузка ЦП с течением времени. Вы можете время от времени обновлять его. Когда вы видите всплеск, просто нажмите на столбец на графике, чтобы просмотреть подробные данные, стоящие за ним.