Nos documentos do PostgreSQL para restrições , ele diz
Uma restrição não nula é funcionalmente equivalente à criação de uma restrição de verificação
CHECK (column_name IS NOT NULL)
, mas no PostgreSQL a criação de uma restrição explícita não nula é mais eficiente.
Eu estou pensando
- O que exatamente significa "mais eficiente"?
- Quais são os inconvenientes de usar em
CHECK (column_name IS NOT NULL)
vez deSET NOT NULL
?
Quero poder adicionar uma NOT VALID
CHECK
restrição e validá-la separadamente (portanto, ela AccessExclusiveLock
é mantida apenas por um curto período de tempo para adicionar a restrição e, em seguida, a ShareUpdateExclusiveLock
é mantida para a etapa de validação mais longa):
ALTER TABLE table_name
ADD CONSTRAINT column_constraint
CHECK (column_name IS NOT NULL)
NOT VALID;
ALTER TABLE table_name
VALIDATE CONSTRAINT column_constraint;
Ao invés de:
ALTER TABLE table_name
ALTER COLUMN column_name
SET NOT NULL;
postgresql
postgresql-9.5
check-constraints
Robin Joseph
fonte
fonte
not in
com as duas variantes? Eles são iguais ou diferem?Respostas:
Meu palpite: "mais eficiente" significa "menos tempo para executar a verificação" (vantagem de tempo). Também pode significar "menos memória é necessária para executar a verificação" (vantagem de espaço). Também pode significar "tem menos efeitos colaterais" (como não travar algo ou travá-lo por períodos mais curtos) ... mas não tenho como saber ou verificar essa "vantagem extra".
Não consigo pensar em uma maneira fácil de verificar uma possível vantagem de espaço (o que, eu acho, não é tão importante quando a memória hoje em dia é barata). Por outro lado, não é tão difícil verificar a possível vantagem de tempo: basta criar duas tabelas iguais, com a única exceção da restrição. Insira um número suficientemente grande de linhas, repita algumas vezes e verifique os tempos.
Esta é a configuração da tabela:
Esta é uma tabela extra, usada para armazenar horários:
E este é o teste realizado, usando o pgAdmin III e o recurso pgScript .
O resultado é resumido na seguinte consulta:
Com os seguintes resultados:
Um gráfico dos valores mostra uma variabilidade importante:
Portanto, na prática, o CHECK (a coluna NÃO É NULL) é um pouco mais lento (0,5%). No entanto, essa pequena diferença pode ser devido a qualquer motivo aleatório, desde que a variabilidade dos tempos seja muito maior que isso. Portanto, não é estatisticamente significativo.
Do ponto de vista prático, eu ignoraria muito o "mais eficiente"
NOT NULL
, porque realmente não vejo isso significativo; considerando que a ausência de umAccessExclusiveLock
é uma vantagem.fonte