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





Profiler может показаться подходом «иголка в стоге сена», но он может оказаться полезным. Попробуйте запустить его на пару минут, пока базы данных находятся под обычной нагрузкой, и посмотрите, не выделяются ли какие-либо запросы как занимающие слишком много времени или каким-то образом ресурсы. Хотя подобная ситуация может указывать на некоторую общую проблему, она также может быть связана с какой-то конкретной проблемой с одним или двумя сайтами, которые при определенных обстоятельствах приводят к серьезным сбоям в работе, что приводит к очень низкой производительности по всем направлениям.
Мы используем продукт Quest Прожектор. Очевидно, что это вложение времени и денег, поэтому это может не помочь вам в краткосрочной перспективе, но если у вас большая среда SQL, это очень полезно.
Это даст вам 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 чтений, заслуживает второго рассмотрения. У вашего приложения может быть другой порог, но идея та же.
Эта утилита от Эрланда Соммарскога очень полезен.
Это хранимая процедура, которую вы добавляете в свою базу данных. Запускайте его всякий раз, когда хотите увидеть, какие запросы активны, и получить хорошее представление о блокировках, блокировках и т. д. Я использую его регулярно, когда все кажется запутанным.
Я нашел Отчеты панели мониторинга производительности очень полезным. Они представляют собой набор настраиваемых отчетов RS, предоставляемых Microsoft. Вам просто нужно запустить установщик на своем клиентском ПК, а затем запустить setup.sql на экземпляре SQL Server.
После этого щелкните правой кнопкой мыши базу данных (неважно какую) в SSMS и перейдите в Отчеты -> Пользовательские отчеты. Найдите и выберите файл performance_dashboard_main.rdl, который по умолчанию находится в папке \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ PerformanceDashboard. Вам нужно сделать это только один раз. После первого раза он появится в списке отчетов.
На главной панели мониторинга, среди прочего, будет отображаться загрузка ЦП с течением времени. Вы можете время от времени обновлять его. Когда вы видите всплеск, просто нажмите на столбец на графике, чтобы просмотреть подробные данные, стоящие за ним.