Вопрос реализации SqlDataReader / DbDataReader - PullRequest
3 голосов
/ 25 марта 2010

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

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

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 25 марта 2010

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

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

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

4 голосов
/ 25 марта 2010

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

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

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

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

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

...