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

Funkcja Oracle Analytic dla wartości minimalnej w grupowaniu

Myślę, że funkcja Rank() nie jest dobrym rozwiązaniem z dwóch powodów.

Po pierwsze, jest prawdopodobnie mniej wydajna niż metoda oparta na Min().

Powodem tego jest to, że zapytanie musi utrzymywać uporządkowaną listę wszystkich wynagrodzeń na dział podczas skanowania danych, a ranga zostanie następnie przypisana później przez ponowne przeczytanie tej listy. Oczywiście w przypadku braku indeksów, które można w tym celu wykorzystać, nie można przypisać rangi, dopóki ostatni element danych nie zostanie odczytany, a utrzymanie listy jest kosztowne.

Tak więc wydajność funkcji Rank() zależy od całkowitej liczby elementów do przeskanowania, a jeśli liczba ta jest wystarczająca, aby sortowanie rozlało się na dysk, wydajność spadnie.

Jest to prawdopodobnie bardziej wydajne:

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

Ta metoda wymaga tylko, aby zapytanie utrzymywało pojedynczą wartość na dział z minimalnej wartości napotkanej do tej pory. W przypadku napotkania nowego minimum, istniejąca wartość jest modyfikowana, w przeciwnym razie nowa wartość jest odrzucana. Całkowita liczba elementów, które muszą być przechowywane w pamięci, jest związana z liczbą działów, a nie liczbą skanowanych wierszy.

Możliwe, że Oracle ma ścieżkę kodu, aby rozpoznać, że ranga tak naprawdę nie musi być obliczana w tym przypadku, ale nie obstawiałbym tego.

Drugim powodem nielubienia Rank() jest to, że po prostu odpowiada na niewłaściwe pytanie. Pytanie nie brzmi „Które rekordy mają wynagrodzenie, które jest pierwszym rankingiem, gdy wynagrodzenia na dział są uporządkowane rosnąco”, ale „Które rekordy mają wynagrodzenie, które jest minimum na dział”. To przynajmniej dla mnie duża różnica.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pierwsze kroki z Oracle SQL Developer w systemie Windows

  2. NOT IN zapytanie... dziwne wyniki

  3. Pobieranie wiadomości ze skrzynki pocztowej za pomocą interfejsu API Mail_Client PL/SQL

  4. ORA-06530:Odniesienie do niezainicjowanego kompozytu

  5. Jak co roku automatycznie resetować wartość sekwencji do 0 w Oracle 10g?