SQL Server - Management Studio - Статистика клиента - Время ожидания ответов сервера и время обработки клиента - PullRequest
12 голосов
/ 01 декабря 2009

У меня медленный запрос, над которым я работаю над оптимизацией.

При просмотре статистики клиента в Management Studio время ожидания ответов сервера составляло около 8 секунд, а время обработки клиента - около 1 секунды.

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

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

Возвращаемый набор результатов точно такой же.

Может ли кто-нибудь пролить свет на то, в чем именно заключается разница между этими двумя числами и что может привести к такому результату?

Ответы [ 2 ]

21 голосов
/ 01 декабря 2009

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

Если вы выполняете запрос с большим «временем ожидания ответов сервера», это означает, что серверу потребовалось много времени для создания самой первой строки. Это обычно для запросов, в которых есть операторы, для оценки которых требуется весь подзапрос, прежде чем они продолжатся (типичный пример - операторы сортировки).

С другой стороны, запрос с очень небольшим «временем ожидания ответов сервера» означает, что запрос смог быстро вернуть первую строку. Однако длительное «время обработки клиента» не обязательно означает, что клиент потратил много времени на обработку, и сервер был заблокирован в ожидании клиента. Это может просто означать, что сервер продолжал возвращать строки из результата, и это время, которое потребовалось для возврата самой последней строки.

То, что вы видите, является результатом изменений в плане запросов, которые, вероятно, удалили оператор, который блокировал выполнение (скорее всего, сортировку), и новый план использует другую стратегию, которая дает первый результат быстрее (вероятно, использует индекс, который гарантирует запрошенный заказ, поэтому сортировка мне не нужна), но в целом дольше.

Если вы беспокоитесь о клиенте, сдерживающем сервер (это может произойти с большими наборами результатов), вам следует изучить wait_type в sys.dm_exec_requests (также информация из sys.dm_os_tasks и sys.dm_os_workers полезно) для сеанса, выполняющего исследуемый запрос. Если я не ошибаюсь, сервер, ожидающий клиента, имеет тип ожидания ASYNC_NETWORK_IO. Вы также можете проверить агрегат sys.dm_os_wait_stats, сбросить его с помощью DBCC SQLPERF("sys.dm_os_wait_stats" , CLEAR), а затем выполнить запрос и посмотреть, как долго складывается тип ожидания ASYNC_NETWORK_IO. Конечно, убедитесь, что во время теста на сервере не происходит никаких других действий.

4 голосов
/ 01 декабря 2009

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

События ожидания SQL Server: вывод догадок из профилирования производительности

Анализ производительности запросов в SQL Server 2005

Отображение базы данных SQL Server ожидает

INF: влияние клиента на пропускную способность SQL Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...