OracleDataReader nie umieści wszystkich rekordów w pamięci. Spójrz na właściwość Fetchsize, która kontroluje ilość rekordów faktycznie przechowywanych w pamięci podręcznej, dopóki nie będziemy potrzebować drugiej podróży w obie strony do bazy danych.
Jeśli chcesz, aby Oracle szybciej zwracał wiersze, możesz spróbować
/*+ FIRST_ROWS(n) */
wskazówka w zapytaniu a
/*+ ALL_ROWS */
wskazówka, czy możesz poczekać na wszystkie dane.