Вопрос в том, есть ли способ ограничить количество упорядоченных строк
вернулся в подзапрос?
Вот что я обычно использую для запросов типа top-n (в данном случае это разбиение на страницы):
select * from (
select a.*, rownum r
from (
select *
from your_table
where ...
order by ...
) a
where rownum <= :upperBound
)
where r >= :lowerBound;
Я обычно использую индексированный столбец для сортировки во внутреннем запросе, а использование rownum означает, что Oracle может использовать оптимизацию count (stopkey). Таким образом, не обязательно делать полное сканирование таблицы:
create table t3 as select * from all_objects;
alter table t3 add constraint t_pk primary key(object_id);
analyze table t3 compute statistics;
delete from plan_table;
commit;
explain plan for
select * from (
select a.*, rownum r
from (
select object_id, object_name
from t3
order by object_id
) a
where rownum <= 2000
)
where r >= 1;
select operation, options, object_name, id, parent_id, position, cost, cardinality, other_tag, optimizer
from plan_table
order by id;
Вы обнаружите, что Oracle выполняет полное сканирование индекса с использованием t_pk. Также обратите внимание на использование опции stopkey.
Надеюсь, это объясняет мой ответ;)