sql >> Base de Datos >  >> RDS >> Oracle

Rendimiento:rango () frente a subconsulta. ¿La subconsulta tiene un costo más bajo?

No estoy muy seguro de cuál es tu pregunta. Si, de acuerdo a estos dos planes de ejecución, en este caso el método de subconsulta tiene un menor costo esperado. No parece demasiado sorprendente, ya que puede usar el índice para ubicar muy rápidamente la fila exacta que le interesa. Específicamente en este caso, la subconsulta solo tiene que hacer un escaneo muy rápido del índice PK. La situación podría ser diferente si la subconsulta involucrara columnas que no fueran parte del índice.

La consulta usando rank() tiene que obtener todas las filas coincidentes y clasificarlas. No creo que el optimizador tenga ninguna lógica de cortocircuito para reconocer que esta es una consulta top-n y, por lo tanto, evitar una ordenación completa, aunque lo único que realmente le importa es la fila mejor clasificada.

También puede probar este formulario, que el optimizador debería reconocer como una consulta top-n. En su caso, esperaría que solo requiera un escaneo de rango único en el índice seguido de un acceso a la tabla.

select * 
  from (select *
          from teste_rank r
          where data_mov <= trunc(sysdate) 
            and codigo = 1
        order by data_mov desc)
  where rownum=1;