Las columnas calculadas son columnas cuyos valores se generan automáticamente a partir de otras columnas en la tabla. El concepto surgió para facilitar el acceso a los resultados de cálculos típicos, evitando la repetición de fórmulas en cada consulta. Pueden ser declaradas como virtuales (los valores se calculan en cada selección) o materializadas (se almacenan físicamente al actualizar los datos).
El problema es que no todas las expresiones se pueden calcular a nivel de tabla (restricciones en los tipos de funciones), y el almacenamiento físico de datos derivados ocupa espacio y requiere mantenimiento de la actualidad al realizar un UPDATE.
Solución: declarar columnas calculadas a nivel de DDL cuando sea posible, o implementar la lógica de actualización a través de triggers/procedimientos, si se requiere almacenamiento o utilizar agregados.
Ejemplo de código (MS SQL Server):
ALTER TABLE orders ADD total_sum AS (quantity * price); -- virtual ALTER TABLE orders ADD total_sum_persisted AS (quantity * price) PERSISTED; -- material
Características clave:
¿Se puede construir un índice en una columna calculada?
Si la columna se declara como PERSISTED (se almacena físicamente), se puede construir un índice. Para las virtuales - no siempre, depende del SGBD.
CREATE INDEX ix_total_sum ON orders (total_sum_persisted);
¿Se actualizan automáticamente las columnas calculadas al cambiar las columnas originales?
Sí, al insertar/editar los datos originales, se calcula un nuevo valor automáticamente, si la columna está declarada a nivel de tabla como calculada.
¿Qué pasa si la columna calculada se refiere a NULL?
La mayoría de los SGBD devuelven NULL si al menos un operando es NULL: asegúrate de manejar el posible valor NULL a través de COALESCE/ISNULL.
ALTER TABLE orders ADD total_with_discount AS (COALESCE(quantity * price, 0));
En la base se almacenan como campos separados el total del producto y el precio, y por separado — total. Al actualizar el producto, se olvidan de actualizar el total.
Ventajas:
Desventajas:
El total se declara como columna virtual. Siempre es exacto y no se descalibra con los valores originales.
Ventajas:
Desventajas: