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
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

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.
  • Odpowiedz
@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łą
  • Odpowiedz
@polak1111:
Ale bzdury.

Po pierwsze napisałem wyraźnie że potrzebuję wyciągnąć cały rekord, a nie jedną wartość.

Po drugie MAX bez grupowania zawsze zwróci jeden rekord więc nie wiem po co
  • Odpowiedz
@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 wymienionym przez Ciebie dziale, pierwszym krokiem jest:
1. Run a full-table scan
polak1111 - @TomaszWKS: 
AD.1 Wybacz, przeoczyłem to :)
AD.2 Wydawało mi się, że na...

źródło: comment_c5XV5lLscIEBnvuu5F5v2wk7VU4cixbl.jpg

Pobierz
  • Odpowiedz
@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
  • Odpowiedz