почему между обоими этими запросами есть разница в приросте производительности?

SELECT instmax,
r
FROM
(SELECT instmax,
rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
WHERE rownum ‹= 10
)
ГДЕ r >=6;

Выход

альтернативный текст

SELECT instmax,
r
FROM
(SELECT instmax,
rownum r
FROM
( SELECT instmax FROM pswlinstmax ORDER BY instmax DESC NULLS LAST
)
)< br> ГДЕ r между 6 и 10;

Выход

альтернативный текст

Действительно ли есть определенный прирост производительности между обоими запросами? Не могли бы вы прояснить мне это?


person Kumar    schedule 27.08.2010    source источник


Ответы (2)


Oracle не может передавать условия, включающие псевдоним ROWNUM, во встроенные представления.

Это означает, что второй запрос будет использовать полное сканирование таблицы (или индекса) с фильтрацией по rn, а первый будет использовать STOPKEY (поскольку он использует ROWNUM < 10 без псевдонимов).

Вы можете прочитать эту статью:

person Quassnoi    schedule 27.08.2010
comment
Я не могу открыть эту ссылку. Не могли бы вы расширить свое объяснение? - person Kumar; 27.08.2010
comment
@Pradosh: там слишком много текста, чтобы скопировать его сюда. Ссылка рабочая (только что проверил). - person Quassnoi; 27.08.2010

Вероятно, это потому, что оптимизация STOPKEY больше не работает.

"rownum ‹ xx" очень особенный (называемый запросом Top-N), который имеет специальные оптимизации. предложение between больше не вызывает этого.

Вы должны сравнить планы выполнения и найти «STOPKEY», если он есть, это оптимизированный запрос Top-N.

смотрите также:

http://blog.fatalmind.com/2010/07/30/analytic-top-n-queries/

person Markus Winand    schedule 27.08.2010
comment
что это за оптимизация STOPKEY? Можете объяснить мне упрощенно? - person Kumar; 27.08.2010
comment
@Pradosh: это означает, что движок остановит запрос после получения записи 10th. - person Quassnoi; 27.08.2010
comment
@Quassnoi.ok, поэтому в 1-м запросе он будет получен только до 10-й строки.ok - person Kumar; 27.08.2010
comment
STOPKEY указывает, что база данных прекращает поиск дальнейших значений, поскольку достигнуто выражение rownum ‹ x. без STOPKEY база данных ищет все значения, но отфильтровывает (на следующем шаге) ненужные. - person Markus Winand; 27.08.2010