sql >> Databasteknik >  >> RDS >> Oracle

Oracle Analytisk funktion för min värde i gruppering

Jag tror att Rank()-funktionen inte är rätt väg att gå med detta, av två anledningar.

För det första är den förmodligen mindre effektiv än en Min()-baserad metod.

Anledningen till detta är att frågan måste ha en ordnad lista över alla löner per avdelning när den skannar data, och rangordningen kommer sedan att tilldelas senare genom att läsa denna lista igen. Uppenbarligen i avsaknad av index som kan utnyttjas för detta, kan du inte tilldela en rang förrän den sista dataposten har lästs, och underhållet av listan är dyrt.

Så prestandan för Rank()-funktionen är beroende av det totala antalet element som ska skannas, och om antalet är tillräckligt för att sorteringen ska spillas till disken kommer prestandan att kollapsa.

Detta är förmodligen mer effektivt:

select dept,
       emp,
       salary
from
       (
       SELECT dept, 
              emp,
              salary,
              Min(salary) Over (Partition By dept) min_salary
       FROM   mytable
       )
where salary = min_salary
/

Den här metoden kräver bara att frågan bibehåller ett enda värde per avdelning av det lägsta värde som har påträffats hittills. Om ett nytt minimum påträffas ändras det befintliga värdet, annars kasseras det nya värdet. Det totala antalet element som måste lagras i minnet är relaterat till antalet avdelningar, inte antalet skannade rader.

Det kan vara så att Oracle har en kodsökväg för att känna igen att Rank egentligen inte behöver beräknas i det här fallet, men jag skulle inte satsa på det.

Den andra anledningen till att man ogillar Rank() är att den bara svarar på fel fråga. Frågan är inte "Vilka poster har den lön som är den första rangordningen när lönerna per avdelning är stigande ordnade", det är "Vilka poster har den lön som är lägsta per avdelning". Det gör en stor skillnad för mig, åtminstone.



  1. Uppdatera Clob-kolumnen i Oracle

  2. Docker:kan inte ansluta Spring Boot &MYSQL

  3. Kopiera CSV till Amazon RDS-värd Postgresql-databas

  4. Parameterisera en MySQL IN-sats i Python-kod