Debido al modelo MVCC de Postgres, y de acuerdo con las reglas de SQL, un UPDATE
escribe una nueva versión de fila para cada fila que no está excluida en la WHERE
cláusula.
Esto lo hace tiene un impacto más o menos sustancial en el rendimiento, directa e indirectamente. Las "actualizaciones vacías" tienen el mismo costo por fila que cualquier otra actualización. Disparan desencadenantes (si están presentes) como cualquier otra actualización, tienen que estar registrados en WAL y producen filas muertas que hinchan la tabla y causan más trabajo para VACUUM
más adelante como cualquier otra actualización.
Las entradas de índices y las columnas TOASTed en las que no se cambia ninguna de las columnas involucradas pueden permanecer iguales, pero eso es cierto para cualquier fila actualizada. Relacionado:
Casi siempre es una buena idea excluir esas actualizaciones vacías (cuando existe una posibilidad real de que ocurra). No proporcionó una definición de tabla en su pregunta (que siempre es una buena idea). Tenemos que suponer que first_name
puede ser NULL (lo que no sería sorprendente para un "nombre"), por lo tanto, la consulta debe usar una comparación NULL-safe :
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
Si first_name IS NULL
antes de la actualización, una prueba con solo first_name <> 'Michael'
evaluaría a NULL y, como tal, excluiría la fila de la actualización. Error furtivo Sin embargo, si la columna está definidaNOT NULL
, use la simple verificación de igualdad, porque es un poco más barato.
Relacionado: