Wpis z mikrobloga

konto usunięte via Wykop Mobilny (Android)
  • 0
Gdy musicie wyciągnąć z tabeli jeden rekord o największej wartości jakiejś kolumny z datą lub liczbą to jak to robicie żeby było najbardziej optymalnie?

Np. jest tabela która zawiera id (number), jakąś datę i inne dane.
Jak najlepiej wyciągnąć tylko pierwszy rekord zwracany przez zapytanie
Select * order by jakas_data desc, id desc ?

Zależy mi na jak największej wydajności.

#oracle #sql #plsql #bazydanych
  • 13
konto usunięte via Wykop Mobilny (Android)
  • 1
@xantiros: sortowanie wykonuje się po filtrowaniu where, więc takie rownum zwróci jakieś losowe rekordy, a nie największe.

Można zrobić podzapytanie i w nim order oraz hint FIRST_ROW, a rownum użyć w zapytaniu nadrzędnym i tak mam w tej chwili zrobione ale czy nie ma czegoś szybszego?

Szukam doświadczonej osoby, która coś podpowie. Jak nie wiecie to nie piszcie bo głupoty piszecie.
@TomaszWKS: select max(data) from orders - najszybsze

Są dwie możliwości co najmniej:

select * from orders where data = (
select max(data) from orders)
and rownum = 1

select * from (
select * from orders order by data desc
) where rownum = 1
@TomaszWKS:
Jeśli nie masz żadnych innych wymagań odnośnie zwracanych danych, a chcesz największą wartość jednej z kolumn to max() będzie najbardziej wydajny jako wbudowana funkcja silnika. Nie ma co kombinować z czymś innym.
W ostatecznosci mozesz dorzucić DISTINCT jeśli odpytywana kolumna może zwrócić wiele wierszy, czyli SELECT MAX(DISTINCT column_1) FROM ORDERS;

Nie polecam opcji z podzapytaniem wykorzystujacym sortowaniem, bo wtedy i tak silnik musi odczytać i wrzucić do pamięci całą tabele
@TomaszWKS:
AD.1 Wybacz, przeoczyłem to :)
AD.2 Wydawało mi się, że na Postgresie pomimo używania MAX(), jeśli masz wiele wartości takich samych (np. ta sama data), na kolumnie na której jej używasz to zwróci Ci wszystkie wiersze z tą wartością. Szybkie sprawdzenie dokumentacji Postgresa i jednak tak sie nie dzieje - DISCTINCT nie potrzebny. Zwracam honor po raz drugi, nie bawiłem się dużo w Postgresie.

AD3. Dokładnie o tym pisałem. W
polak1111 - @TomaszWKS: 
AD.1 Wybacz, przeoczyłem to :)
AD.2 Wydawało mi się, że na...

źródło: comment_c5XV5lLscIEBnvuu5F5v2wk7VU4cixbl.jpg

Pobierz
@polak1111:

AD3. Dokładnie o tym pisałem. W wymienionym przez Ciebie dziale, pierwszym krokiem jest:

1. Run a full-table scan on T.

Zakładając, że trochę tych danych tam masz i nie ma żadnych indeksów (tak jak w przykładzie) to przecież to jest zabójstwo dla bazy przy wykonaniu podzapytania SELECT * FROM orders ORDER BY column1.


I zrzuca wszystko na dysk żeby posortować. Użycie ROWNUM sprawia, że nie zrzuca na dysk bo