sql >> Databáze >  >> RDS >> Oracle

Výkon:rank() vs poddotaz. Dílčí dotaz má nižší cenu?

Nejsem si jistý, jaká je vaše otázka. Ano, podle těchto dvou prováděcích plánů má v tomto případě metoda poddotazu nižší očekávané náklady. Nezdá se to příliš překvapivé, protože může pomocí indexu velmi rychle najít přesný řádek, který vás zajímá. Konkrétně v tomto případě musí poddotaz pouze velmi rychle prohledat index PK. Situace by mohla být jiná, pokud by poddotaz zahrnoval sloupce, které nebyly součástí indexu.

Dotaz pomocí rank() musí získat všechny odpovídající řádky a seřadit je. Nevěřím, že optimalizátor má nějakou zkratovou logiku, aby rozpoznal, že se jedná o dotaz nejvyšší n, a proto se vyhnul úplnému řazení, i když jediné, na čem vám záleží, je řádek s nejvyšším hodnocením.

Můžete také vyzkoušet tento formulář, který by měl optimalizátor rozpoznat jako top-n dotaz. Očekával bych ve vašem případě, že by to vyžadovalo pouze skenování jednoho rozsahu v indexu, po kterém by následoval přístup k tabulce.

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


  1. Jak změnit adresář databáze mysql na WAMP

  2. Jak mohu dotazovat databázi MySQL z aplikace Rails bez modelů?

  3. Jak provést LEVÝ SEMI JOIN v SQL Server

  4. MySQL:Velký VARCHAR vs. TEXT?