Я работаю с оракулом 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
)
также работает ужасно. Я не понимаю волшебства от первого запроса и как применить его к дальнейшим подобным запросам.
Насколько я понимаю, присвоение rownum происходит после (или «как») выбранной строки, поэтому любой запрос «ROWNUM> = n» с n больше 1 вызовет проблемы. Мне объяснили, что просматривается первая строка; это rownum 1, поэтому он не соответствует критериям и отбрасывается. Просматривается следующая строка; он по-прежнему будет rownum 1, поскольку набор результатов пуст, не соответствует критериям и отбрасывается. Этот процесс продолжается до тех пор, пока все строки не будут прочитаны и отклонены.
Действительно ли длительный запрос производит какие-либо данные? Или вы всегда убивали его до завершения?
ROWNUM - это псевдостолбец (не настоящий столбец), доступный в запросе. ROWNUM будут присвоены номера 1, 2, 3, 4, ... N, где N - количество строк в наборе, с которым используется ROWNUM. В первом случае вы сокращаете количество рядов сразу же, а во втором вам нужно искать все, чтобы отрезать вещи больше двух.