Подтвердить что ты не робот

Как загружаются данные из SQL Server в SqlDataReader?

Когда я вызываю этот код:

using (var connection = new SqlConnection(connectionString))
{
    var command = new SqlCommand("SELECT * FROM Table", connection);
    connection.Open();
    using (var reader = command.ExecuteReader())
    {
        while(reader.Read())
        {
            // Do something here
        }
    }
}

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

Я спрашиваю, потому что я только что прочитал, что ODP.NET предоставляет свойство FetchSize как в OracleCommand, так и в OracleDataReader, которое я понимаю как определение того, сколько записей должно быть предварительно загружено одним обращением в базу данных. Интересно, работает ли SQL Server аналогичным образом и если есть какое-то подобное поведение, которое можно настроить где-то. Я не нашел такой конфигурации в SqlCommand, SqlDataReader или CommandBehavior.

4b9b3361

Ответ 1

данные передаются от сервера sql к клиенту в пакетах размера в свойстве SqlConnection.PacketSize. Если ваш клиент не может прочитать результаты достаточно быстро, буфер на сетевой карте заполняется, протокол обнаруживает это и прекращает прием, что, в свою очередь, делает полный буфер отправки сетевой карты сервера sql и прекращает отправку всех и всех данных. если вы хотите спуститься до уровня protocl, проверьте TDS protcol.

Ответ 2

Я считаю, что точные данные о сетевых связях зависят от множества вещей вне вашего образца кода, частично из-за Пул соединений SQL Server, но я думаю, что вы ищете свойство SqlConnection.PacketSize (MSDN).