Sei que adicionar uma restrição de chave estrangeira requer uma varredura de tabela e um SHARE ROW EXCLUSIVE
bloqueio em ambas as tabelas.
Para evitar a possível varredura de tabela longa, a restrição pode ser adicionada com a NOT VALID
abordagem. Mas estou pensando, ao adicionar uma nova coluna, você também deve usar NOT VALID
ou o Postgres é inteligente o suficiente para reconhecer que é uma nova coluna e, portanto, a tabela inteira não precisa ser varrida?
Estou usando Django, e o SQL gerado para adicionar uma coluna de chave estrangeira se parece com isto:
ALTER TABLE
"example"
ADD
COLUMN "new_column_id" integer NULL CONSTRAINT "example_new_column_id_fk" REFERENCES "another_table"("id") DEFERRABLE INITIALLY DEFERRED;
SET
CONSTRAINTS "example_new_column_id_b781b6be_fk" IMMEDIATE;