SELECT MAX(id) w PostgreSQL
Jak znaleźć najnowszą (czyt. o największym id) krotkę? Wydawałoby się, że nic prostrzego – wystarczy użyć funkcji agregującej MAX():
SELECT MAX( id ) FROM tab_a;
I rzeczywiście w większości przypadków MAX() zdaje egzamin i to bardzo dobrze. Na testowych danych zapytanie wykonywało się 0.05ms. Rozważmy jednak bardziej skomplikowany przypadek:
SELECT MAX( id ) FROM tab_a a JOIN tab_b b ON ( a.xx = b.yy );
I tutaj przestaje być wesoło. Powyższy przykład wykonywał się ponad 22ms, czyli prawie 500 razy dłużej! Oczywiście zarówno id jak i kolumny z warunku połączeniowego mają prawidłowe indeksy. Problem polega na tym, że wynik połączenia zaindeksowany już nie jest i MAX() wykonuje seq scan na tych danych.
Rozwiązanie jest trywialne – wystarczy nie używać MAX():
SELECT id FROM tab_a a JOIN tab_b b ON ( a.xx = b.yy ) ORDER BY id DESC LIMIT 1;
Rezultat: 0.12ms.
Poniżej dowód w postaci screenshotów z “życiowej” bazy (wybaczcie cenzurę – nie chcę ujawniać struktury bazy):
Komentarze (1)



