Именно это и делает метод getIterator
Не совсем. Во-первых, не fetchAll() используется, fetch(), так как на каждую итерацию идет выборка только одной строки из БД. Во-вторых, getIterator получая очередную строчку данных, набивает ее в конечный объект. А формируя запрос и выполняя fetch() самостоятельно, мы просто оперируем полученными данными. Это во многие разы снижает потребление ресурсов.