Tentando adicionar uma NOT NULL
restrição a uma tabela com 1 bilhão de linhas. Não posso permitir um bloqueio de mesa por mais de alguns segundos. Existe uma maneira de evitar uma verificação completa da tabela durante a instrução alter table? Criei um Ãndice na coluna esperando que fosse usado, mas isso não parece funcionar. Pode ser uma restrição de verificação? Outras opções? Obrigada!
relate perguntas
-
Posso ativar o PITR depois que o banco de dados foi usado
-
Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo
-
Os procedimentos armazenados impedem a injeção de SQL?
-
Sequências Biológicas do UniProt no PostgreSQL
-
Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?
No momento, não há uma maneira segura e suportada de fazer isso com o PostgreSQL.
Algum tipo de
ALTER TABLE ... ADD CONSTRAINT ... CONCURRENTLY
seria bom, mas ninguém o implementou. O mesmo com a alternativa de adicionar umaNOT VALID
restrição que ainda afeta novas linhas e que vocêVALIDATE
mais tarde - seria bom e é algo que todos sabem que é necessário, mas ninguém teve tempo ou financiamento para adicionar ainda.Em teoria, você pode modificar diretamente os catálogos do sistema para adicionar a restrição, se souber que ela é verdadeira e válida. Na prática, bem, geralmente não é uma boa ideia.
Então não, não há realmente uma maneira.
Uma alternativa possÃvel é criar uma restrição de verificação usando
NOT VALID
, validando a restrição de verificação posteriormente. Esse método requer manter umACCESS EXCLUSIVE
bloqueio apenas durante a criação da restrição, que deve ser da ordem de milissegundos. OVALIDATE
comando executará uma varredura de tabela completa demorada para validar a restrição, mas mantém umSHARE UPDATE EXCLUSIVE
bloqueio menos restritivo.Quanto às compensações, não consegui encontrar nenhuma documentação que mencione diferenças de mecanismo interno entre uma
NOT NULL
restrição padrão e uma restrição de verificação que valide que uma coluna não é nula. Lembro-me de desenterrar uma postagem no fórum que iludiu uma possÃvel diferença de desempenho, mas perdeu o link, portanto, isso não foi confirmado.Fontes:
https://www.postgresql.org/docs/9.4/static/sql-altertable.html https://www.postgresql.org/docs/9.4/static/explicit-locking.html