Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Leistung:rank() vs. Unterabfrage. Sub-Abfrage haben niedrigere Kosten?

Ich bin mir nicht sicher, was Ihre Frage ist. Ja, gemäß diesen beiden Ausführungsplänen hat die Unterabfragemethode in diesem Fall niedrigere erwartete Kosten. Scheint nicht allzu überraschend zu sein, da es den Index verwenden kann, um sehr schnell genau die Zeile zu finden, an der Sie interessiert sind. Speziell in diesem Fall muss die Unterabfrage nur einen sehr schnellen Scan des PK-Index durchführen. Die Situation könnte anders sein, wenn die Unterabfrage Spalten beinhaltete, die nicht Teil des Indexes waren.

Die Abfrage mit rank() muss alle übereinstimmenden Zeilen erhalten und sie ordnen. Ich glaube nicht, dass der Optimierer irgendeine Kurzschlusslogik hat, um zu erkennen, dass dies eine Top-n-Abfrage ist, und daher eine vollständige Sortierung zu vermeiden, obwohl Sie sich wirklich nur um die oberste Zeile kümmern.

Sie können auch dieses Formular ausprobieren, das der Optimierer als Top-n-Abfrage erkennen sollte. Ich würde in Ihrem Fall erwarten, dass nur ein einziger Bereichsscan auf dem Index erforderlich ist, gefolgt von einem Tabellenzugriff.

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