В нашей предыдущей статье мы обсудили важность статистики ожидания и как начать ее сбор. В этой статье мы более подробно рассмотрим, как статистика ожидания генерируется в SQL Server и как она может помочь вам анализировать и оптимизировать производительность вашей базы данных.
Планировщики
Прежде чем мы углубимся в статистику ожидания, важно понять концепцию планировщиков в SQL Server. Планировщик создается для каждого логического процессора в вашей системе, с дополнительным планировщиком для выделенного административного подключения (DAC). Основная роль планировщиков – планирование времени ЦП для потоков.
Вы можете просмотреть планировщики в вашем экземпляре SQL Server, выполнив запрос к представлению sys.dm_os_schedulers. У каждого планировщика есть три фазы или состояния, через которые проходят потоки:
- ВЫПОЛНЕНИЕ: Поток в настоящее время выполняется ЦП.
- ГОТОВ: Поток имеет все необходимые ресурсы и ожидает в очереди, чтобы быть выполненным ЦП.
- ПРИОСТАНОВЛЕН: Поток ожидает дополнительных ресурсов.
Поток будет перемещаться через эти фазы в определенном порядке. Он начинается в очереди ПРИОСТАНОВЛЕН, собирая необходимые ресурсы. Как только ресурсы становятся доступными, он перемещается в очередь ГОТОВ, которая является очередью потоков по принципу “первым пришел – первым обслужен”. Наконец, поток достигает вершины очереди ГОТОВ и входит в фазу ВЫПОЛНЕНИЕ, где его выполняет ЦП. Если потоку требуются дополнительные ресурсы или он выполняется слишком долго, он будет возвращен в очередь ПРИОСТАНОВЛЕН и снова пройдет через фазы.
Статистика ожидания
Теперь, когда мы понимаем, как планировщики выполняют потоки, давайте рассмотрим, как генерируется статистика ожидания. Ниже приведена иллюстрация, где генерируются времена ожидания:
Время ожидания ресурса – это время, которое поток проводит в фазе ПРИОСТАНОВЛЕН, ожидая ресурсы. С другой стороны, время ожидания сигнала – это время, которое поток проводит в фазе ГОТОВ (или очереди) перед выполнением ЦП. Сложив эти два значения, мы получаем общее время ожидания, также известное как время ожидания. Например, если поток проводит 2 мс в фазе ПРИОСТАНОВЛЕН и 3 мс в фазе ГОТОВ, время ожидания будет составлять 5 мс.
SQL Server записывает эти времена ожидания в двух представлениях динамического управления (DMV), которые вы можете использовать для мониторинга статистики ожидания:
- sys.dm_os_waiting_tasks: Это представление показывает, что выполняется на ваших планировщиках в момент запроса. Столбец wait_duration_ms указывает время ожидания потока, а столбец wait_type показывает тип ожидания, которое испытывает поток. Анализируя это представление, вы можете быстро определить, на что SQL Server ожидает, когда он работает медленно. Если вы заметите высокую частоту одного и того же типа ожидания или очень долгое время ожидания, это может указывать на то, что доступ к определенному ресурсу замедляет ваш сервер.
- sys.dm_os_wait_stats: Это представление предоставляет накопительный вид типов ожидания и соответствующих времен ожидания с момента запуска экземпляра SQL Server или очистки статистики вручную. Столбец wait_time_ms показывает общее время ожидания для каждого типа ожидания, а столбец single_wait_time_ms отображает точное время, которое тип ожидания провел в очереди ГОТОВ. Кроме того, столбец waiting_tasks_count указывает количество вхождений для каждого типа ожидания.
Путем запроса этих представлений вы можете получить ценную информацию о том, как выполняется ваш SQL Server и на что он ожидает. Эта информация может помочь вам выявить узкие места и оптимизировать производительность вашей базы данных.
Понимание статистики ожидания критично для администраторов баз данных и разработчиков, которые хотят оптимизировать производительность своего SQL Server. Мониторинг и анализ статистики ожидания позволяют выявить и устранить проблемы производительности, в конечном итоге повышая общую эффективность вашей базы данных.
Для получения дополнительной информации о статистике ожидания и о том, как ее собирать, обратитесь к нашей предыдущей статье: Почему статистика ожидания важна и как начать ее собирать прямо сейчас!