Создает ли Oracle ROWNUM всю таблицу перед тем, как извлечь нужные строки? - PullRequest
2 голосов
/ 20 декабря 2011

Мне нужно сделать панель навигации, которая показывает только подмножество возможного большого набора результатов.Это подмножество - 20 записей до и 20 записей после результирующего набора записей.Когда я перемещаюсь по результатам через панель навигации, я буду применять дизайн скользящего окна, используя ROWNUM, чтобы получить следующее подмножество.У меня вопрос: строит ли Oracle ROWNUM всю таблицу, прежде чем она извлечет нужные вам строки?Или он достаточно умен, чтобы генерировать только нужные мне строки?Я погуглил и не смог найти объяснения этому.

Ответы [ 5 ]

2 голосов
/ 20 декабря 2011

Относительно названия вопроса.

См. http://www.orafaq.com/wiki/ROWNUM и это подробное объяснение Тома Кайта.

Относительно цели вопроса.

Это должно быть то, что вы ищете: Пейджинг с Oracle

2 голосов
/ 20 декабря 2011

Ваше решение не будет работать (как правильно указал Боб), но вы можете использовать row_number(), чтобы делать то, что вы хотите:

SELECT col1, 
       col2
FROM ( 
   SELECT col1, 
          col2, 
          row_number() over (order by some_column) as rn
   FROM your_table
) t
WHERE rn BETWEEN 10 AND 20

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

Редактировать: забыл ответить на ваш первоначальный вопрос:

С вышеупомянутым решением, да Oracle придется построить полный результат, чтобы найтиправильная нумерация

2 голосов
/ 20 декабря 2011

Для этого используется метод предварительной аналитической функции:

select col1, col2 from (
    select col1, col2, rownum rn from (
        select col1, col2 from the_table order by sort_column
      )
      where rownum <= 20
  )
  where rn > 10

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

0 голосов
/ 27 августа 2012

Это старый вопрос, но вы должны попробовать это - http://www.inf.unideb.hu/~gabora/pagination/results.html

0 голосов
/ 20 декабря 2011

Я не думаю, что ваш дизайн будет работать так, как вы планировали.Oracle присваивает значения ROWNUM в том порядке, в котором они получены запросом - первой произведенной строке присваивается ROWNUM = 1, второй присваивается ROWNUM = 2 и т. Д. Обратите внимание, что для назначения ROWNUM = 21 запрос должен сначалавернуть первые двадцать строк, и, таким образом, если вы напишите запрос, который говорит

SELECT *
  FROM MY_TABLE
  WHERE ROWNUM >= 21 AND
        ROWNUM <= 40

, никакие строки не будут возвращены, потому что для того, чтобы были строки с ROWNUM> = 21, запрос должен сначала вернуть все строки сROWNUM <= 20. </p>

Надеюсь, это поможет.

...