«Время ожидания ответов сервера» - это время между последним пакетом запроса, оставленным клиентом, и самым первым ответным пакетом, возвращенным с сервера. «Время обработки клиента» - это время между первым ответным пакетом и последним ответным пакетом. Между прочим, я не смог найти документацию, подтверждающую эти заявления, но я бы сказал, основываясь на моих наблюдениях, что они действительно обоснованные предположения.
Если вы выполняете запрос с большим «временем ожидания ответов сервера», это означает, что серверу потребовалось много времени для создания самой первой строки. Это обычно для запросов, в которых есть операторы, для оценки которых требуется весь подзапрос, прежде чем они продолжатся (типичный пример - операторы сортировки).
С другой стороны, запрос с очень небольшим «временем ожидания ответов сервера» означает, что запрос смог быстро вернуть первую строку. Однако длительное «время обработки клиента» не обязательно означает, что клиент потратил много времени на обработку, и сервер был заблокирован в ожидании клиента. Это может просто означать, что сервер продолжал возвращать строки из результата, и это время, которое потребовалось для возврата самой последней строки.
То, что вы видите, является результатом изменений в плане запросов, которые, вероятно, удалили оператор, который блокировал выполнение (скорее всего, сортировку), и новый план использует другую стратегию, которая дает первый результат быстрее (вероятно, использует индекс, который гарантирует запрошенный заказ, поэтому сортировка мне не нужна), но в целом дольше.
Если вы беспокоитесь о клиенте, сдерживающем сервер (это может произойти с большими наборами результатов), вам следует изучить 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. Конечно, убедитесь, что во время теста на сервере не происходит никаких других действий.