Para consultar top-n filas en Oracle, es general utilizar ROWNUM. Así que la siguiente consulta parece bien (consigue más recientes 5 pagos):Oracle ROWNUM rendimiento
select a.paydate, a.amount
from (
select t.paydate, t.amount
from payments t
where t.some_id = id
order by t.paydate desc
) a
where rownum <= 5;
Pero por muy grandes mesas, que no es eficaz - para mí correr el agua durante ~ 10 minutos. así que he intentado otras consultas, y que terminó con éste, que tiene una duración de menos de un segundo:
select *
from (
select a.*, rownum
from (select t.paydate, t.amount
from payments t
where t.some_id = id
order by t.paydate desc) a
)
where rownum <= 5;
para averiguar lo que está sucediendo, miré planes de ejecución para cada consulta. Por primera consulta:
SELECT STATEMENT, GOAL = ALL_ROWS 7 5 175
COUNT STOPKEY
VIEW 7 5 175
TABLE ACCESS BY INDEX ROWID 7 316576866 6331537320
INDEX FULL SCAN DESCENDING 4 6
Y por segundo:
SELECT STATEMENT, GOAL = ALL_ROWS 86 5 175
COUNT STOPKEY
VIEW 86 81 2835
COUNT
VIEW 86 81 1782
SORT ORDER BY 86 81 1620
TABLE ACCESS BY INDEX ROWID 85 81 1620
INDEX RANGE SCAN 4 81
Obviamente, es ÍNDICE SCAN completos que descienden que hace primera consulta ineficiente para grandes mesas. Pero realmente no puedo diferenciar la lógica de dos consultas mirándolas. ¿Alguien podría explicarme las diferencias lógicas entre dos consultas en lenguaje humano?
¡Gracias de antemano!
id es una variable de enlace, no (debería ser: id?) Si es así, ¿qué valor se usa (¿lo mismo?) – tbone
No creo que el 'rownum' que está utilizando para el filtro en la segunda versión sea se garantiza que será el mismo que en el primero; ¿Cree que necesita alias su segunda consulta y referenciarla, o agregar 'order by rownum' en la consulta en contra de' a'? Sin embargo, dudo que esto esté afectando la velocidad. –