Wpisy z October, 2009

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):

True Solutions Blog – reanimacja.

Ostatnimi czasy cała nasza energia jest skupiona wokół Funneli i zupełnie zaniedbaliśmy bloga firmowego na rzecz bloga naszego prostego rozwiązania CRM. Postanowiłem przywrócić do życie to miejsce, jednocześnie tworząc z niego “notatnik programisty”. Od teraz na blogu True Solutions będą się pojawiały bardzo krótkie wpisy z dziedziny szeroko pojętej inżynierii oprogramowania. Będą to wszelkie uwagi/spostrzeżenia/odkrycia/sztuczki na jakie napotkam się w pracy nad projektami (głownie Funnela, ale mogą pojawić się również jakieś akademickie rozważania).