Почему эти, казалось бы, похожие запросы имеют столь разное время выполнения? - PullRequest
6 голосов
/ 29 апреля 2010

Я работаю с оракулом 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
) 

также выполняет ужасно. Я не понимаю магию первого запроса и то, как применить ее к другим аналогичным запросам.

Ответы [ 2 ]

4 голосов
/ 30 апреля 2010

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

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

1 голос
/ 30 апреля 2010

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

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