Вопрос реализации SqlDataReader / DbDataReader

Кто-нибудь знает, как на самом деле работают DbDataReaders. Мы можем использовать SqlDataReader в качестве примера.

Когда вы делаете следующее

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

while(rdr.Read())
{
  //Do something
}

У читателя данных есть все строки в памяти, или он просто захватывает одну, а затем, когда вызывается Read, он переходит к базе данных и захватывает следующую? Кажется, что просто занесение одного в память было бы плохой производительностью, но введение всех их потребовало бы времени на вызов ExecuteReader.

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

Мне просто любопытно, если у кого-нибудь есть идея.

2 ответа

Решение

Как указано здесь:

Использование DataReader может повысить производительность приложения как за счет извлечения данных, как только они становятся доступными, так и (по умолчанию) сохранения только одной строки за раз в памяти, что снижает нагрузку на систему.

И, насколько я знаю, так работает каждый читатель в.NET Framework.

Рапсодия верна.

Результаты возвращаются при выполнении запроса и сохраняются в сетевом буфере на клиенте до тех пор, пока вы не запросите их, используя метод Read DataReader.

Я провел тест с использованием DataReaders против DataAdaptors на равном наборе данных, равном 10000, и обнаружил, что DataAdaptor был последовательно на 3-4 миллисекунды быстрее, чем DataReader, но DataAdaptor в конечном итоге будет удерживать больше памяти.

Когда я запустил тот же тест на равных 50 000 наборах записей, я увидел увеличение производительности на стороне DataReader до 50 миллисекунд.

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

Другие вопросы по тегам