Columnas calculadas y columnas computadas persistidas

Clase 10 de 26Curso de Gestión de Bases de Datos con SQL Server

Resumen

Repetir la misma fórmula en decenas de scripts es un problema silencioso que crece con cada consulta nueva. Las columnas calculadas (o computadas) de SQL Server permiten definir esa lógica una sola vez dentro de la tabla, evitando inconsistencias y simplificando el mantenimiento. Cuando además se persisten, el resultado se almacena físicamente en disco y solo se recalcula ante cambios en las columnas de las que depende, lo que se traduce en una mejora de rendimiento notable.

¿Por qué centralizar el cálculo en una columna computada?

Imaginemos a un analista que necesita obtener el margen porcentual de cada producto. La fórmula es sencilla: (precio - costo) / precio * 100. El problema aparece cuando esa misma expresión se copia en diez, veinte o más scripts diferentes [0:22]. Si la lógica del cálculo cambia, habría que localizar y actualizar cada uno de esos archivos.

Una columna calculada resuelve esto porque la fórmula vive en un solo lugar: la definición de la tabla. SQL Server la evalúa en tiempo de consulta, es decir, no ocupa espacio en disco por defecto, solo almacena la expresión y la ejecuta cada vez que se consulta la tabla [1:32].

¿Cómo agregar una columna calculada con ALTER TABLE?

El proceso utiliza el comando ALTER TABLE junto con ADD:

sql ALTER TABLE productos ADD margen_porcentaje AS (precio - costo) / precio * 100;

También es posible agregar varias columnas calculadas en operaciones sucesivas. Por ejemplo, para incluir un precio con IVA del 21 % [2:28]:

sql ALTER TABLE productos ADD precio_con_iva AS precio * 1.21;

Al explorar la tabla en el explorador de objetos de SQL Server Management Studio, estas columnas aparecen con un ícono distinto y la etiqueta "calculado" junto a su tipo de dato [2:51].

¿Se puede modificar una columna calculada con UPDATE?

No. Intentar ejecutar un UPDATE sobre una columna calculada genera un error [3:37]. La forma correcta de cambiar la fórmula —por ejemplo, pasar del 21 % al 19 % de IVA— es eliminar la columna y volver a crearla:

sql ALTER TABLE productos DROP COLUMN precio_con_iva;

ALTER TABLE productos ADD precio_con_iva AS precio * 1.19;

Es un detalle importante: no se puede usar UPDATE ni ALTER COLUMN directamente. Siempre es DROP COLUMN seguido de ADD.

¿Qué significa persistir una columna calculada?

Una columna calculada estándar se evalúa en cada SELECT. Cuando se marca como PERSISTED, el resultado se guarda físicamente en disco [4:43]. La ventaja es que SQL Server solo recalcula el valor cuando se modifica alguna de las columnas de las que depende la fórmula (en este caso, precio o costo), en lugar de calcularlo en cada lectura.

Para crear una columna calculada persistida con manejo de valores nulos y división por cero:

sql ALTER TABLE productos ADD margen_porcentaje AS CASE WHEN costo IS NULL OR precio = 0 THEN NULL ELSE CAST((precio - costo) / precio * 100 AS DECIMAL(10,2)) END PERSISTED;

El uso de CASE protege contra escenarios donde el costo sea nulo o el precio sea cero, evitando errores de división [5:05]. La cláusula PERSISTED al final es la que indica a SQL Server que materialice el resultado.

¿Cuándo conviene persistir y cuándo no?

  • Sin persistencia: la fórmula se recalcula en cada consulta. Útil cuando los datos cambian con mucha frecuencia y el cálculo es ligero.
  • Con persistencia: el valor se almacena y solo se recalcula ante cambios en las columnas fuente. Ideal para tablas que se leen mucho más de lo que se actualizan, convirtiendo la columna en una herramienta de optimización real [6:20].

Las columnas persistidas además permiten crear índices sobre ellas, algo que no es posible con columnas calculadas no persistidas en todos los escenarios.

¿Cómo practicar con un desafío real?

El reto propuesto consiste en agregar a la tabla de productos una columna calculada persistida llamada valor_inventario con la fórmula precio * stock [6:38]:

sql ALTER TABLE productos ADD valor_inventario AS precio * stock PERSISTED;

Este ejercicio refuerza la diferencia entre definir una expresión calculada y materializarla con PERSISTED. Comparte tu solución en los comentarios y experimenta cambiando los valores de precio o stock para verificar que el recálculo automático funciona correctamente.