PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Qual é o custo das restrições CHECK no Postgres 9.x?


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):

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.