Эффективный механизм для извлечения rownum

#oracle

#Oracle

Вопрос:

Вот краткий ответ. Итак, я прочитал о rownum в Интернете и пытаюсь понять,
какой способ его вызова лучше всего использовать, поскольку на основе SQL Optimizer оба подхода не показывают
никакой разницы.

 select count(distinct BCC || '~' || BN) BCCN 
from LINK_TBL 
where AN = 'abcdefg' 
and BR = 1 
and rownum <= 5;
  

или

 select count(distinct BCCN)
from (
select BCC||'~'|| BN BCCN 
from LINK_TBL 
where AN = 'abcdefg' and BR = '1'
)
where rownum <= 5;
  

Ответ №1:

Оптимизатор может решить / реорганизовать ваш запрос по своему усмотрению, если это обеспечивает правильные результаты. Если вы проверите план объяснения, вы можете обнаружить, что они идентичны.

Комментарии:

1. Спасибо за ответ. Поскольку я проанализировал это подробнее прошлой ночью и данные от @Allan, они действительно идентичны. Я новичок в этом материале, отсюда и путаница.

Ответ №2:

Я подозреваю, что вам не хватает значимости использования order by при использовании rownum . Два отправленных вами запроса функционально эквивалентны. Однако следующие два запроса не:

 select count(distinct BCC || '~' || BN) BCCN 
from LINK_TBL 
where AN = 'abcdefg' 
and BR = 1 
and rownum <= 5
order by BCC || '~' || BN;

select count(distinct BCCN)
from (
select BCC||'~'|| BN BCCN 
from LINK_TBL 
where AN = 'abcdefg' and BR = '1'
order by BCC || '~' || BN
)
where rownum <= 5;
  

Разница в том, что первый запрос получает все строки в указанном порядке, затем принимает первые 5 строк, а второй запрос any получает 5 строк, затем сортирует только эти 5.

Комментарии:

1. Спасибо за информацию. Это очень помогает, но порядок по не является необходимым для моего использования в этом. Но это добавляет мне много знаний.