Первый вопрос, который нам надо разобрать — Когда происходят ожидания?
Ответ достаточно прост: когда SQL Server выполняет запрос и вынужден ждать ресурсы для него, в этот момент SQL Server регистрирует задержку/ожидание. Позже мы можем анализировать эти задержки, чтобы понять их причину и возможно устранить их. Не всегда возможно устранить задержки на 100%.
Прежде чем мы продолжим, мы должны понимать 3 этапа жизни запроса:
Running — запрос выполняется на стороне CPU.
Runnable – запросы, которые готовы к выполнению и ожидают своей очереди для вызова. Другими словами, запрос готов, но ожидает освобождения процессора, который выполняет другой запрос.
Suspended — запрос, который ожидает по какой либо причине (вы их знаете, они были изучены в День № 1) перевода его в статус runnable. Другими словами это время (wait time), которое мы пытаемся уменьшить.
Иными словами время выполнения запроса состоит из Running + Suspended + Runnable.
Позвольте мне объяснить это на простом примере «такси и пассажир»
Двое друзей, Том и Дэнни, поехали в торговый центр вместе. Когда они вышли их торгового центра, они решили взять такси. Том и Дэнни стоят ожидая их очереди поймать такси. Начинается их время ожидания (wait time), они готовы сесть в такси, но такси обслуживает других клиентов и они должны ждать своей очереди. Другими словами они находятся в состоянии runnable.
Теперь, когда пришла их очереди сесть в такси, таксист говорит им, что не принимает кредитные карты. Ни Том и Дэнни не взяли с собой наличные деньги. Тогда им приходится отпустить таксиста, так как он не может ждать и пойти за деньгами к банкомату. Том и Дэнни не смогут уехать, пока не снимут деньги. Сейчас они находятся в состоянии suspended.
Как только они получили наличные, они снова становятся в очередь за такси, создавая очередной сигнал для ожидания (wait time). На этот раз у них есть наличные деньги, чтобы добраться до дома. Время, затраченное такси, чтобы добрать от торгового центра до дома это ни что иное как состояние running.
Я надеюсь, что данный пример помог вам лучше понять систему ожиданий.
Следующий запрос, созданный Glenn Berry, поможет вам понять процентное соотношение ожиданий в системе:
SELECT CAST(100.0 * SUM(signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) AS [%signal (cpu) waits], CAST(100.0 * SUM(wait_time_ms - signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) AS [%resource waits] FROM sys.dm_os_wait_stats OPTION (RECOMPILE);
По-моему опыту, когда система более или менее стабильна, то ожидание CPU (первый столбец) будет ниже 20%. Но повторюсь, это не абсолютное значение, которое можно оспорить.
В будущих статьях мы обсудим конкретные типы ожиданий и варианты их устранения.
Автор: Pinal Dave
*** *** *** *** *** *** *** *** *** *** *** ***
Полезные Скрипты
Рубрика Проверь себя
Ссылка на наш канал YouTube