Vorrei accreditare la risposta di @robin-salih, l'ho usata e l'implementazione di min for int, per creare il seguente codice:
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 (<)
);
È quasi lo stesso, ma sfrutta i vantaggi dell'indice B-tree, quindi select min(id) from tbl
funziona in pochi millisecondi.
PS Non sono un esperto di pgsql, forse il mio codice è in qualche modo sbagliato, ricontrolla prima dell'uso in produzione, ma spero che utilizzi correttamente gli indici e l'esecuzione parallela. L'ho fatto solo dal codice di esempio, senza scavare nella teoria dietro gli aggregati in PG.