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


Dodaj ten wpis do:

wykop wykop del.icio.us del.icio.us

1 Komentarz

  1. [...] truesolutions.pl 20:48 27/11/2009 True Solutions » SELECT MAX(id) w PostgreSQL truesolutions.pl/…g/select-max_id_-w-postgr… Pokaż reakcje /* */ inne strony z tej witryny + obserwuj co [...]

Twój komentarz