Oracle Rownum SQL - PullRequest
       3

Oracle Rownum SQL

0 голосов
/ 02 июля 2011

Каковы различия (преимущества и недостатки) между этими двумя методами кодирования?

select * from (
    select rownum rnun, * from table where rownum < x
) where rnum > y


select * from (
    select * from table
) where rownum < x and x > y

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Два запроса возвращают разные строки.

Ни один запрос не является детерминированным. Поэтому ни один запрос не должен использоваться в реальной системе.

Первый запрос, по крайней мере, является попыткой создать окно строк (строк между x и y). Однако, поскольку ORDER BY не существует, порядок строк не является детерминированным, и окно, вероятно, не выполняет то, что вы хотите.

Второй запрос возвращает произвольные x строк данных (при условии x> y). В противном случае он возвращает 0 строк (если y> = x). Если вы пытаетесь создать какой-то оконный запрос, это не так.

Если вы хотите, чтобы оконный запрос работал, вы бы хотели что-то вроде

SELECT *
  FROM (SELECT a.*,
               row_number() over (order by something) rnum
          FROM table_name)
 WHERE rnum BETWEEN x AND y

Если вы хотите использовать ROWNUM, вам нужно что-то вроде

SELECT *
  FROM (SELECT a.*,
               rownum rnum
          FROM( SELECT b.*
                  FROM table_name
                 ORDER BY something) a)
 WHERE rownum < y
   AND rnum > x

Но это, как правило, менее эффективно, чем метод аналитических запросов.

0 голосов
/ 03 июля 2011

Помимо отсутствия условия «упорядочить по ...» ... Может быть, вопрос касается функции Oracle STOPKEY?В случае запросов «подкачки» Oracle может использовать функцию STOPKEY для ограничения числа строк в подзапросе, это может привести к некоторому приросту производительности.

Посмотрите на этот запрос:

select *
  from (select a.*,
               row_number() over (order by sname) rnum
          from t_patient_card a)
 where rnum between 1 and 100           

                                                        Cost    Cardinality

SELECT STATEMENT, GOAL = FIRST_ROWS                     313272  3571266
 VIEW        HOSPITAL2$                                 313272  3571266
  SORT ORDER BY                                         313272  3571266
   COUNT
  TABLE ACCESS FULL    HOSPITAL2$    T_PATIENT_CARD     38883   3571266

Oracle извлек все строки перед тем, как вернуть только 100 из них

Перепишем запрос следующим образом:

select *
  from (
  select rownum as rn,tt.*  from  
  (
   select  t.* from t_patient_card t order by  t.sname
  )tt where rownum<100       
    ) 
 WHERE rn >1

В этом случае мы используем rownum <100 в подзапросе, чтобы сообщить оптимизаторучто мы хотим получить меньше 100 строк. </p>

                                                        Cost    Cardinality
SELECT STATEMENT, GOAL = ALL_ROWS                       313272  99
 VIEW    HOSPITAL2$                                     313272  99
  COUNT STOPKEY
   VIEW    HOSPITAL2$                                   313272  3571266
    SORT ORDER BY STOPKEY                               313272  3571266
  TABLE ACCESS FULL    HOSPITAL2$    T_PATIENT_CARD     38883   3571266

Вы видите «стоп-ключ счета», и количество шагов после этого шага составляет всего 99. В моей базе данных второй запрос выполняется на одну секунду быстрее, чем первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...