Das liegt am CursorType des Recordset's.
Der Default ist ServerCursor, so dass die Daten immer erst mit dem nächsten MoveNext gelesen werden.
Beim ClientCursor werden beim Open sämtliche Daten in das Recordset geladen, was dann auchschon mal dauern kann (wenn man gerade eine Tabelle mit Millionen von Sätzen erwischt).

Spätestens wenn du mit Where-Klauseln arbeitest, solltest du mit Command-Objekten und Parametern "?" arbeiten. Das ist am effektivsten.