2018-09-07 14: 10: 46,421 1 INFO EntityDataRepository [jobInstanceID: 0] - - Завершено за 11776 мс с результатом: SqlDataReader
Это означает, что SqlCommand.ExecuteReader()
завершено, и сервер начинает возвращать строки клиенту. Запрос в SQL Server все еще выполняет на данный момент. Возможно, он помещал в буфер все результаты запроса или, возможно, только что нашел и возвратил первые несколько совпадающих строк, используя план потокового запроса. Таким образом, для выполнения IQueryable<T>.ToList()
запрос должен быть завершен на сервере, строки результата должны быть переданы клиенту, а EF должен прочитать строки и материализовать их в экземпляры класса типа T
.
Работу на стороне клиента можно проанализировать с помощью Visual Studio Profiler , счетчиков производительности или System.Diagnostics.Process .
SQL Server отслеживает статистику выполнения запросов для запросов в кэше плана и для всех запросов, если используется Query Store в SQL 2016+. Статистика покажет вам истекшее время запроса, которое включает в себя время ожидания клиентом для чтения (и обработки) строк и всех других ожиданий, а также «рабочее время», которое представляет собой процессорное время, используемое запросом. Хранилище запросов в SQL 2017 и базе данных SQL Azure также отслеживает статистику ожидания для каждого запроса, поэтому вы можете различать ожидания на клиенте (ASYNC_NETWORK_IO
) и другие ожидания, такие как чтение файла данных (PAGEIOLATCH
), ожидания блокировки (LCK_*_*
) ) и т. д.