Лучшая практика для нумерации страниц в Oracle?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

26
задан Howie 6 December 2012 в 06:33
поделиться

4 ответа

Если вы уже используете аналитику (ROW_NUMBER() OVER ...), то добавление еще одной аналитической функции к тому же разделению приведет к незначительным затратам на запрос.

С другой стороны, есть много других способов сделать нумерацию страниц, один из которых использует rownum:

SELECT * 
  FROM (SELECT A.*, rownum rn
          FROM (SELECT *
                  FROM your_table
                 ORDER BY col) A
         WHERE rownum <= :Y)
 WHERE rn >= :X

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

Оба метода являются подходящими, но в целом, если вы хотите, чтобы количество строк и набор разбивались на страницы, использование аналитики более эффективно, поскольку вы запрашиваете строки только один раз.

26
ответ дан JGFMK 6 December 2012 в 06:33
поделиться

В Oracle 12C вы можете использовать лимит LIMIT и OFFSET для нумерации страниц.

Пример. Предположим, у вас есть таблица tab, из которой необходимо извлечь данные на основе столбца DATE типа данных dt в порядке убывания с разбивкой на страницы.

page_size:=5

select * from tab
order by dt desc
OFFSET nvl(page_no-1,1)*page_size ROWS FETCH NEXT page_size ROWS ONLY;

Объяснение:

page_no = 1 page_size = 5

OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY - Выбрать только первые 5 строк

page_no = 2 page_size = 5

OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY - получить следующие 5 строк

и т. д.

Референсные страницы -

https://dba-presents.com/index.php/databases/oracle/31-new-pagination-method-in-oracle-12c-offset-fetch

https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1#paging

2
ответ дан Tajinder 6 December 2012 в 06:33
поделиться
  • 1
    @LovaChittumuri заявите свою проблему ясно. Чего Вы пытаетесь достигнуть, введите, и желаемый вывод. – Jerry 6 March 2019 в 16:17
  • 2
    @LovaChittumuri заявите свою проблему ясно. Чего Вы пытаетесь достигнуть, введите, и желаемый вывод. – Jerry 6 March 2019 в 16:17
  • 3
    @LovaChittumuri заявите свою проблему ясно. Чего Вы пытаетесь достигнуть, введите, и желаемый вывод. – Jerry 6 March 2019 в 16:17
  • 4
    @LovaChittumuri заявите свою проблему ясно. Чего Вы пытаетесь достигнуть, введите, и желаемый вывод. – Jerry 6 March 2019 в 16:17
  • 5
    @LovaChittumuri заявите свою проблему ясно. Чего Вы пытаетесь достигнуть, введите, и желаемый вывод. – Jerry 6 March 2019 в 16:17

Я также столкнулся с подобной проблемой. Я перепробовал все вышеперечисленные решения, и ни одно из них не дало мне лучшей производительности. У меня есть таблица с миллионами записей, и мне нужно отобразить их на экране на страницах 20. Я сделал следующее, чтобы решить проблему.

  1. Добавить новый столбец ROW_NUMBER в таблицу.
  2. Сделать столбец первичным ключом или добавить к нему уникальный индекс.
  3. Используйте программу для заполнения (в моем случае Informatica), чтобы заполнить столбец rownum.
  4. Извлечение записей из таблицы с использованием оператора Между. (ВЫБЕРИТЕ * ИЗ ТАБЛИЦЫ, ГДЕ ROW_NUMBER МЕЖДУ LOWER_RANGE И UPPER_RANGE).

Этот метод эффективен, если нам нужно сделать безусловную выборку нумерации страниц на огромном столе.

0
ответ дан Ram Kiran 6 December 2012 в 06:33
поделиться

Извините, этот работает с сортировкой:

SELECT * FROM (SELECT ROWNUM rnum,a.* FROM (SELECT * FROM "tabla" order by "column" asc) a) WHERE rnum BETWEEN "firstrange" AND "lastrange";
0
ответ дан Infinite Recursion 6 December 2012 в 06:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: