Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wydajność:rank() a podzapytanie. Pod zapytanie ma niższy koszt?

Nie jestem do końca pewien, jakie jest twoje pytanie. Tak, zgodnie z tymi dwoma planami wykonania, w tym przypadku metoda podzapytania ma niższy oczekiwany koszt. Nie wydaje się to zbyt zaskakujące, ponieważ może użyć indeksu do bardzo szybkiego zlokalizowania dokładnego wiersza, który Cię interesuje. W szczególności w tym przypadku podzapytanie musi wykonać tylko bardzo szybkie skanowanie indeksu PK. Sytuacja może być inna, jeśli podzapytanie dotyczyło kolumn, które nie były częścią indeksu.

Zapytanie używające rank() musi zebrać wszystkie pasujące wiersze i uszeregować je. Nie wierzę, że optymalizator ma jakąkolwiek logikę zwarcia, aby rozpoznać, że jest to zapytanie o najwyższym n i dlatego unika pełnego sortowania, nawet jeśli tak naprawdę zależy ci tylko na wierszu z najwyższej pozycji.

Możesz również wypróbować ten formularz, który optymalizator powinien rozpoznać jako zapytanie o top-n. Spodziewałbym się, że w twoim przypadku będzie to wymagało tylko pojedynczego skanowania zakresu indeksu, a następnie dostępu do tabeli.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź zakresy z serii liczb w SQL/Oracle

  2. Nielegalne użycie typu danych LONG Oracle

  3. Problem polegający na tym, że zmienne wiążące Oracle nie używają poprawnie indeksu

  4. Problem z tworzeniem widoku Oracle

  5. Rekursywnie wyliczaj skoncentrowane uwagi w widoku Oracle DBA_DEPENDENCIES