Algumas pessoas tentam evitar
NULL
valores, alegando que a lógica seria confuso. Eu não sou um deles.
NULL
os valores são bons para colunas sem dados. Eles são certamente a maneira mais barata de armazenar colunas "vazias" - para espaço em disco e desempenho (o principal efeito são tabelas e índices menores):- Não usar NULL no PostgreSQL ainda usa um bitmap NULL no cabeçalho?
- A configuração "NOT NULL" em uma coluna no postgresql aumenta o desempenho?
- As colunas anuláveis ocupam espaço adicional no PostgreSQL?
Depois de entender a natureza de
NULL
valores, não há razão para evitá-los. O Postgres oferece uma variedade de funções para lidar com NULLs. colaesce()
, nullif()
, concat()
, concat_ws()
, ... Geralmente, no que diz respeito ao desempenho está em causa, uma restrição NOT NULL supera uma restrição CHECK e ambos vencem gatilhos por um tiro de log. Mas mesmo gatilhos simples são baratos. O custo de um
NOT NULL
restrição é quase nada. Além disso, tudo isso afeta apenas as operações de gravação, mas na maioria dos aplicativos as operações de leitura predominam. O impacto mais relevante no desempenho (à parte índices e consultas abaixo do ideal), portanto, é o tamanho de tabelas e índices ou, mais importante, o número de tuplas por página de dados . Tuplas maiores levam a um desempenho mais lento para a maioria dos casos de uso. O número de páginas de dados que precisam ser lidas para atender a uma consulta aumenta de acordo. A memória cache disponível é saturada mais cedo.
Não tenho um benchmark pronto, mas é melhor testar para seu ambiente específico de qualquer maneira. Estas são apenas regras simples. A realidade é muito mais complexa.