Проблема в том, что вы фильтруете в том же запросе, что и ROWNUM. Следовательно, причина, по которой вы должны иметь подзапрос, сначала сгенерировать rownum, а затем применить фильтрацию. Почему BETWEEN работает нормально, вероятно, является некоторым нюансом того, как движок обрабатывает запрос, но я бы опасался, что он не всегда будет давать правильные результаты. Так что дело не в производительности, а в том, чтобы действительно получать правильные результаты.
Эта статья объясняет, почему вы должны поставить больше, чем за пределами подзапроса:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
SELECT * FROM employees
WHERE ROWNUM > 1;
"Первой извлеченной строке присваивается ROWNUM, равный 1, и условие становится ложным. Вторая извлекаемая строка теперь является первой строкой, а также присваивается значение ROWNUM, равное 1, и делает условие ложным. Все строки впоследствии не могут выполнить выполнить условие, поэтому строки не возвращаются. "