Я не так хорошо знаком с Oracle, как хотелось бы. У меня около 250 тыс. Записей, и я хочу отображать их по 100 на странице. В настоящее время у меня есть одна хранимая процедура, которая извлекает все четверть миллиона записей в набор данных с помощью адаптера данных, набора данных и метода dataadapter.Fill (набор данных) для результатов из хранимой процедуры. Если у меня есть целочисленные значения «Номер страницы» и «Количество записей на странице», которые я могу передать в качестве параметров, что было бы наилучшим способом вернуть только этот конкретный раздел. Скажем, если я передам 10 в качестве номера страницы и 120 в качестве количества страниц, из оператора select я получу от 1880-го до 1200-го или что-то в этом роде, моя математика в моей голове может быть отключена.
Я делаю это в .NET с C #, подумал, что это не важно, если я смогу понять это правильно на стороне sql, тогда я должен быть крутым.
Обновление: я смог использовать предложение Брайана, и оно отлично работает. Я хотел бы поработать над некоторой оптимизацией, но страницы появляются через 4–5 секунд, а не за минуту, и мой элемент управления подкачкой смог очень хорошо интегрироваться с моими новыми сохраненными процессами.
источник
WHERE
не могут быть объединеныAND
, и затем нашел это: orafaq.com/wiki/ROWNUMСпросите Тома о разбиении на страницы и очень-очень полезных аналитических функциях.
Это выдержка с той страницы:
источник
В интересах полноты, для людей, ищущих более современное решение, в Oracle 12c есть некоторые новые функции, включая улучшенную подкачку страниц и верхнюю обработку.
Пейджинг
Пейджинг выглядит так:
Лучшие записи N
Получение топовых записей выглядит так:
Обратите внимание, как в обоих приведенных выше примерах запросов есть
ORDER BY
предложения. Новые команды соблюдают их и запускаются на отсортированных данных.Мне не удалось найти хорошую справочную страницу Oracle для
FETCH
или,OFFSET
но на этой странице есть отличный обзор этих новых функций.Производительность
Как отмечает @wweicker в комментариях ниже, производительность - это проблема с новым синтаксисом в 12c. У меня не было копии 18c, чтобы проверить, улучшил ли ее Oracle с тех пор.
Интересно, что мои фактические результаты были возвращены немного быстрее, когда я впервые выполнил запросы к своей таблице (более 113 миллионов строк) для нового метода:
Однако, как упомянул @wweicker, план объяснения выглядит намного хуже для нового метода:
Новый синтаксис вызвал полное сканирование индекса в моем столбце, что было полной стоимостью. Скорее всего, при ограничении неиндексированных данных все становится намного хуже.
Давайте посмотрим, включает ли один неиндексированный столбец в предыдущий набор данных:
Резюме: используйте с осторожностью, пока Oracle не улучшит эту обработку. Если у вас есть индекс, с которым можно работать, возможно, вам удастся использовать новый метод.
Надеюсь, у меня скоро будет копия 18c, с которой можно будет поиграть, и я смогу обновить
источник
Сразу хочу подытожить ответы и комментарии. Есть несколько способов разбивки на страницы.
До oracle 12c не было функциональности OFFSET / FETCH, поэтому взгляните на технический документ, как предлагал @jasonk. Это самая полная статья о различных методах, которую я нашел, с подробным объяснением преимуществ и недостатков. Чтобы скопировать их сюда, потребуется значительное время, поэтому я не буду этого делать.
Есть также хорошая статья от создателей jooq, в которой объясняются некоторые распространенные проблемы с разбивкой на страницы Oracle и других баз данных. сообщение в блоге jooq
Хорошие новости, начиная с oracle 12c, у нас появилась новая функциональность OFFSET / FETCH. Новые возможности OracleMagazine 12c . Пожалуйста, обратитесь к разделу «Топ-N запросов и разбивки на страницы».
Вы можете проверить свою версию оракула, выполнив следующее заявление
источник
Попробуйте следующее:
через [tecnicume]
источник
В своем проекте я использовал Oracle 12c и java . Код подкачки выглядит так:
источник