2009-11-08 4 views
4

Итак, я понимаю, что SqlDataReader довольно быстр, вы не знаете, сколько строк вы получите, и оно выделяет только память для каждой строки за раз. Итак, если у меня есть миллион строк небольших строк (скажем, от 4 до 32 байт), каждая строка чтения означает обратный переход к серверу? Не происходит буферизация?SqlDataReader, курсор firehose - без буферизации?

Если я использовал ODBC через собственный клиент SQL, я мог бы настроить буфер буфера, соответствующий размеру, чтобы выбрать 512 строк в каждом обратном направлении. Когда потребитель читает строку 0, я делаю выборку из 512 строк, а затем возвращаю строку 0, следующие 511-чтения - это обращения к памяти, а 513-е чтение - это новая обратная связь.

Для меня это должно быть быстрее (и не обязательно должно быть только переадресацией), однако это зависит от того, как будет реализован набор результатов на сервере. В последнем случае результирующий набор должен быть закончен, прежде чем я смогу начать получать по сети, но может быть не так (?) Для SqlDataReader и TDS, которые, я считаю, он использует, протокол, с которым я не знаком. Любые комментарии оценены.

+0

Duplicate: http://stackoverflow.com/questions/1383920/how-datareader-works –

ответ

3

Нет, SqlDataReader выполняет буфер на стороне клиента. Конечно, вы не отправляетесь на сервер, чтобы получать ваши строки.

4

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

Смежные вопросы