Почему эти на вид подобные запросы имеют такое решительно различное время выполнения?

Я работаю с оракулом DB, пытающийся настроить некоторые запросы, и я испытываю затруднения при понимании, почему, работая конкретный пункт конкретным способом оказывает такое решительное влияние на производительность запросов. Вот производительная версия запроса, который я делаю

select * from 
(
    select a.*, rownum rn from 
    ( 
         select *
         from table_foo
    ) a where rownum <= 3
) where rn >= 2

Тот же запрос путем замены последних двух строк этим

    ) a where rownum >=2 rownum <= 3
) 

работает ужасно. Несколько хуже порядков величины

    ) a where rownum between 2 and 3
) 

также работает ужасно. Я не понимаю волшебства от первого запроса и как применить его к дальнейшим подобным запросам.

6
задан Jherico 29 April 2010 в 20:09
поделиться

2 ответа

Насколько я понимаю, присвоение rownum происходит после (или «как») выбранной строки, поэтому любой запрос «ROWNUM> = n» с n больше 1 вызовет проблемы. Мне объяснили, что просматривается первая строка; это rownum 1, поэтому он не соответствует критериям и отбрасывается. Просматривается следующая строка; он по-прежнему будет rownum 1, поскольку набор результатов пуст, не соответствует критериям и отбрасывается. Этот процесс продолжается до тех пор, пока все строки не будут прочитаны и отклонены.

Действительно ли длительный запрос производит какие-либо данные? Или вы всегда убивали его до завершения?

4
ответ дан 17 December 2019 в 04:43
поделиться

ROWNUM - это псевдостолбец (не настоящий столбец), доступный в запросе. ROWNUM будут присвоены номера 1, 2, 3, 4, ... N, где N - количество строк в наборе, с которым используется ROWNUM. В первом случае вы сокращаете количество рядов сразу же, а во втором вам нужно искать все, чтобы отрезать вещи больше двух.

1
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

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