В интересах полноты, для людей, которые ищут более современное решение, в Oracle 12c есть несколько новых функций, в том числе улучшенная подкачка страниц и лучшая обработка.
Paging
Пейджинг выглядит так:
SELECT *
FROM user
ORDER BY first_name
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
Top N Records
Получение лучших записей выглядит так:
SELECT *
FROM user
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY
Обратите внимание, что в обоих приведенных выше примерах запросов есть предложения ORDER BY
. Новые команды уважают их и запускаются на отсортированных данных.
Мне не удалось найти хорошую справочную страницу Oracle для FETCH
или OFFSET
, но на этой странице представлен отличный обзор этих новых функций.
Производительность
Как отмечает @wweicker в комментариях ниже, производительность - это проблема с новым синтаксисом в 12c. У меня не было копии 18с, чтобы проверить, улучшил ли ее Oracle.
Интересно, что мои фактические результаты были возвращены немного быстрее при первом запуске запросов в моей таблице (113 миллионов + строк) для нового метода:
- Новый метод: 0,013 секунды.
- Старый метод: 0,107 секунд.
Однако, как упоминал @wweicker, план объяснения выглядит гораздо хуже для нового метода:
- Стоимость нового метода: 300 110
- Стоимость старого метода: 30
Новый синтаксис вызвал полное сканирование индекса в моем столбце, что было полной стоимостью. Скорее всего, дела обстоят намного хуже, если ограничить неиндексированные данные.
Давайте посмотрим при включении одного неиндексированного столбца в предыдущий набор данных:
- Новый метод время / стоимость: 189,55 секунд / 998 908
- Старый метод время / стоимость: 1,973 секунды / 256
Резюме: используйте с осторожностью, пока Oracle не улучшит эту обработку. Если у вас есть индекс для работы, возможно, вы можете обойтись без использования нового метода.
Надеюсь, у меня скоро будет копия 18c, с которой можно поиграть, и я смогу обновить