почему разница в производительности между этими двумя запросами? - PullRequest
1 голос
/ 27 августа 2010

SELECT instmax,
г
ОТ
(ВЫБЕРИТЕ instmax,
rownum r
ОТ
(ВЫБЕРИТЕ instmax ИЗ pswlinstmax ЗАКАЗАТЬ по instmax DESC NULLS LAST
)
ГДЕ РОУНУМ <= 10 <br> )
ГДЕ r> = 6;

выход

alt text

ВЫБЕРИТЕ instmax,
г * * тысяча двадцать-три ОТ
(ВЫБЕРИТЕ instmax,
rownum r
ОТ
(ВЫБЕРИТЕ instmax ИЗ pswlinstmax ПОРЯДОК ПО INSTmax DESC NULLS LAST
)
)
ГДЕ r между 6 и 10;

выход

alt text

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

Ответы [ 2 ]

1 голос
/ 27 августа 2010

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

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

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

0 голосов
/ 27 августа 2010

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

"rownum

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

см. Также:

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

...