Ограничение возвращаемой записи из SQL-запроса в Oracle - PullRequest
5 голосов
/ 28 января 2009

Одно из приложений, о котором я позабочусь, проверяя таблицу БД Oracle каждые x секунд, чтобы увидеть, есть ли новые данные для обработки (другие приложения реального времени заполняют их).

Наш новый клиентский бизнес-процесс вынуждает нас в режиме реального времени заполнять эту таблицу большим количеством записей в одно и то же время (скажем, 10 000), но всего несколько раз в день. В следующий раз, когда мое приложение проверяет, есть ли что-то для обработки, оно встречает 10 000 записей и пытается это обработать.

Это не очень хорошо спроектировано и просто недостаточно хорошо масштабируется. Быстрое исправление будет ограничивать количество записей, которые приложение получает от Oracle, в следующий раз оно выберет еще 50 (или что-то еще) и т. Д.

Как я могу ограничить в Oracle SQL количество возвращаемых записей? Заказ имеет значение!

  select * 
    from cool_table where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
order by seq_nr, entry_dts;

Ответы [ 2 ]

15 голосов
/ 28 января 2009
select * from
(select c.* from cool_table c
   where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
   order by seq_nr, entry_dts)
where rownum < 50

Необходимо убедиться, что упорядочение выполнено до фильтрации rownum (в противном случае он займет первые 50 найденных строк, а затем упорядочит их)

1 голос
/ 23 ноября 2016

Начиная с Oracle 12c, он, наконец, поддерживает стандартную опцию ANSI fetch first n rows:

select * 
from cool_table where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
order by seq_nr, entry_dts
fetch first 50 rows only;

Это можно комбинировать со смещением для подкачки:

select * 
from cool_table where date >= to_date('200901010000', 'YYYYMMDDhh24mi') 
order by seq_nr, entry_dts
offset 50 rows 
fetch first 50 rows only;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...