Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Desempenho:rank() vs subconsulta. Sub consulta tem custo menor?


Não tenho muita certeza de qual é a sua pergunta. Sim, de acordo com esses dois planos de execução, neste caso, o método de subconsulta tem um custo esperado menor. Não parece muito surpreendente, pois pode usar o índice para localizar rapidamente a linha exata em que você está interessado. Especificamente neste caso, a subconsulta só precisa fazer uma varredura muito rápida do índice PK. A situação pode ser diferente se a subconsulta envolver colunas que não fazem parte do índice.

A consulta usando rank() tem que obter todas as linhas correspondentes e classificá-las. Eu não acredito que o otimizador tenha qualquer lógica de curto-circuito para reconhecer que esta é uma consulta top-n e, portanto, evitar uma classificação completa, mesmo que tudo o que você realmente se importe seja a linha mais bem classificada.

Você também pode tentar este formulário, que o otimizador deve reconhecer como uma consulta top-n. Eu esperaria que, no seu caso, exigisse apenas uma única varredura de intervalo no índice, seguida de um acesso à tabela.
select * 
  from (select *
          from teste_rank r
          where data_mov <= trunc(sysdate) 
            and codigo = 1
        order by data_mov desc)
  where rownum=1;