#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. Спасибо за информацию. Это очень помогает, но порядок по не является необходимым для моего использования в этом. Но это добавляет мне много знаний.