Ao adicionar NOT NULL
colunas com um DEFAULT
valor - o PostgreSQL otimiza esta operação?
Caso a tabela tenha n linhas, uma coluna alter-table-add não otimizada resultaria em n gravações do valor padrão - o que poderia ser muito doloroso, obviamente. Com a otimização, o banco de dados criaria instantaneamente a nova coluna, armazenaria apenas uma cópia do valor padrão que seria retornado quando nenhum valor não padrão fosse encontrado para essa coluna em uma estrutura de dados de índice adequada.
Por exemplo , o Oracle 11g tem essa otimização .
Não existe tal mecanismo no PostgreSQL.
No entanto, você ainda pode evitar os efeitos excessivos de tal mudança de tabela.
A instrução a seguir adquire um bloqueio exclusivo de acesso na tabela durante a instrução/transação:
Essa instrução altera o catálogo e reescreve toda a tabela para que a nova coluna contenha o valor padrão em todas as linhas. Se a tabela tiver muitas linhas e for acessada com frequência suficiente, isso causaria alguns problemas temporários.
Para evitá-lo, tente manter o bloqueio exclusivo o mais curto possível:
Como isso é basicamente apenas uma (na verdade duas) alteração no catálogo (nenhuma alteração de dados ocorre), ela será concluída rapidamente. Em seguida, dependendo de suas necessidades e do uso da tabela, você pode atualizar a nova coluna para o padrão em uma etapa ou em lotes e, quando terminar, definir a coluna como
NOT NULL
.Atualização sobre um desejo se tornando realidade: o PostgreSQL 11 terá esse recurso. Veja https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ para mais.
Sim, com PostgreSQL 11
Esse recurso é novo e chegou à versão 11.
O comando acima é um desses comandos que será afetado por essa otimização; mas, deve-se dizer que não
NOT NULL
é necessário. Qualquer nova coluna adicionada com um padrão não nulo é otimizada agora. Você pode encontrar a entrada neste commitfest Você também deve verificar este ótimo artigo sobre isso, "A Missing Link in Postgres 11: Fast Column Creation with Defaults" .Solução alternativa pré-PostgreSQL 11
Se você está tentando evitar o table-lock exclusivo na mesa, siga o conselho de Craig Ringer,
DEFAULT
ALTER
para adicionar oDEFAULT
depois, para que se aplique às linhas recém-inseridasUPDATE
sNOT NULL
restrição