En documentos de PostgreSQL para restricciones , dice
Una restricción no nula es funcionalmente equivalente a crear una restricción de verificación
CHECK (column_name IS NOT NULL)
, pero en PostgreSQL crear una restricción explícita no nula es más eficiente.
me pregunto
- ¿Qué significa exactamente "más eficiente"?
- ¿Cuáles son las desventajas de usar en
CHECK (column_name IS NOT NULL)
lugar deSET NOT NULL
?
Quiero poder agregar una NOT VALID
CHECK
restricción y validarla por separado (por lo tanto, AccessExclusiveLock
solo se mantiene durante un corto período de tiempo para agregar la restricción y luego ShareUpdateExclusiveLock
se mantiene para el paso de validación más largo):
ALTER TABLE table_name
ADD CONSTRAINT column_constraint
CHECK (column_name IS NOT NULL)
NOT VALID;
ALTER TABLE table_name
VALIDATE CONSTRAINT column_constraint;
En lugar de:
ALTER TABLE table_name
ALTER COLUMN column_name
SET NOT NULL;
postgresql
postgresql-9.5
check-constraints
Robin Joseph
fuente
fuente
not in
con ambas variantes? ¿Son iguales o difieren?Respuestas:
Mi conjetura: "más eficiente" significa "se requiere menos tiempo para realizar la verificación" (ventaja de tiempo). También puede significar "se requiere menos memoria para realizar la verificación" (ventaja de espacio). También podría significar "tiene menos efectos secundarios" (como no bloquear algo o bloquearlo por períodos más cortos de tiempo) ... pero no tengo forma de saber o verificar esa "ventaja adicional".
No puedo pensar en una manera fácil de verificar una posible ventaja de espacio (que, supongo, no es tan importante cuando la memoria hoy en día es barata). Por otro lado, no es tan difícil verificar la posible ventaja de tiempo: solo cree dos tablas que sean iguales, con la única excepción de la restricción. Inserte un número suficientemente grande de filas, repita varias veces y verifique los tiempos.
Esta es la configuración de la tabla:
Esta es una tabla adicional, utilizada para almacenar tiempos:
Y esta es la prueba realizada, usando pgAdmin III, y la función pgScript .
El resultado se resume en la siguiente consulta:
Con los siguientes resultados:
Un gráfico de los valores muestra una variabilidad importante:
Entonces, en la práctica, el CHEQUE (columna NO ES NULO) es un poco más lento (en un 0.5%). Sin embargo, esta pequeña diferencia puede deberse a cualquier razón aleatoria, siempre que la variabilidad de los tiempos sea mucho mayor que eso. Entonces, no es estadísticamente significativo.
Desde un punto de vista práctico, ignoraría mucho el "más eficiente"
NOT NULL
, porque realmente no veo que sea significativo; Considerando que creo que la ausencia de unAccessExclusiveLock
es una ventaja.fuente