Chciałbym podziękować odpowiedzi @robin-salih , użyłem jej i implementacji min dla int, aby zbudować następujący kod:
CREATE OR REPLACE FUNCTION min(uuid, uuid)
RETURNS uuid AS $$
BEGIN
IF $2 IS NULL OR $1 > $2 THEN
RETURN $2;
END IF;
RETURN $1;
END;
$$ LANGUAGE plpgsql;
create aggregate min(uuid) (
sfunc = min,
stype = uuid,
combinefunc = min,
parallel = safe,
sortop = operator (<)
);
Prawie to samo, ale korzysta z zalet indeksu B-drzewa, więc select min(id) from tbl
działa w kilku milisekundach.
PS Nie jestem ekspertem od pgsql, być może mój kod jest w jakiś sposób błędny, sprawdź dokładnie przed użyciem w produkcji, ale mam nadzieję, że poprawnie używa indeksów i wykonywania równoległego. Zrobiłem to tylko z przykładowego kodu, nie zagłębiając się w teorię dotyczącą agregatów w PG.