Вопрос реализации 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 предназначен только для пересылки, поэтому, если вам нужно перемещаться в наборе результатов, это не лучший выбор.