rownum очень медленный после определенного значения

Я запускаю запрос в разработчике Oracle SQL, который выглядит примерно так:

выберите * из dummy_table, где col1 ‹ 10 и col2 ‹ 20 и col3 ‹ 40 и rownum ‹= x

Запрос занимает около 3 секунд и возвращает x строк, если значение x равно ‹= 12.

Но если заменить x на что-то большее, чем 12, запрос займет более 7 секунд и вернет только 12 результатов (другими словами, есть только 12 строк, удовлетворяющих предложению where).

Почему rownum ведет себя так? Я ожидал, что этот запрос займет почти такое же время, если значение x изменится с 12 на 13.

Редактировать: Еще одна вещь, которую я заметил, это составной индекс для столбцов col1, col2 и col3. Если я удалю индекс (или отключу его с помощью подсказки), запрос будет выполняться довольно быстро.


person baba26    schedule 31.05.2016    source источник


Ответы (1)


Трудно дать полное объяснение, не зная структуры таблицы, индексов и т. д.

Однако для простоты, если в вашей таблице есть только 12 строк, соответствующих вашему условию, запрос первых 12 строк означает, что Oracle просто ищет 12 строк и возвращает их, независимо от количества строк, которые не соответствуют вашему условию.

Если вы запрашиваете, скажем, 13 строк, Orace должен просмотреть всю таблицу, чтобы проверить, существует ли 13-я строка.

Таким образом, без индексов и подсказок запрос первых 13 строк, где существует только 12, может потребовать полного сканирования таблицы, а это может быть медленным.

Пожалуйста, рассматривайте это как очень упрощенное объяснение, не учитывая индексы, кеш, подсказки. Например, мы не учитываем, что даже проверка производительности запроса простым его выполнением может ввести в заблуждение, поскольку Oracle может использовать кеш, и после первого запуска производительность может быть выше.

person Aleksej    schedule 31.05.2016
comment
Ответ, который вы мне даете, звучит разумно. Фактически, я также предполагал, что оракул будет делать что-то подобное за кулисами. Но я не смог найти ни одной ссылки, подтверждающей эту теорию. Не могли бы вы процитировать любую ссылку, которая подтверждает ваш ответ? - person baba26; 01.06.2016