Как работает выборка данных из SQL Server в SqlDataReader? - PullRequest
17 голосов
/ 17 мая 2011

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

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.

Ответы [ 2 ]

11 голосов
/ 17 мая 2011

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

2 голосов
/ 17 мая 2011

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

...