Oracle
 sql >> база данни >  >> RDS >> Oracle

Производителност:rank() срещу подзаявка. Подзаявката има по-ниска цена?

Не съм много сигурен какъв е въпросът ти. Да, според тези два плана за изпълнение, в този случай методът на подзаявката има по-ниска очаквана цена. Не изглежда твърде изненадващо, тъй като може да използва индекса, за да намери много бързо точния ред, който ви интересува. По-конкретно в този случай, подзаявката трябва да направи само много бързо сканиране на PK индекса. Ситуацията може да е различна, ако подзаявката включва колони, които не са част от индекса.

Заявката, използваща rank() трябва да получи всички съвпадащи редове и да ги класира. Не вярвам, че оптимизаторът има някаква логика на късо съединение, за да разпознае, че това е заявка с най-висок клас и следователно да избегне пълно сортиране, въпреки че всичко, което наистина ви интересува, е най-високо класираният ред.

Можете също така да опитате този формуляр, който оптимизаторът трябва да разпознае като запитване от първо място. Бих очаквал във вашия случай, че ще изисква само едно сканиране на диапазон на индекса, последвано от достъп до таблица.

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. Oracle:Select distinct не работи, когато курсорът е вътре в курсор (използвайки израз на курсора)

  2. Проблем с Django inspectdb при използване на база данни на Oracle

  3. Изберете от таблицата, ако записът е намерен в друга таблица

  4. Защо имената на таблица/колона/индекс на Oracle са ограничени до 30 знака?

  5. Каква е разликата между OCI и THIN драйверна връзка с връзка към източник на данни между java и oracle XE?