Published on

October 4, 2025

Cómo convertir columnas calculadas en persistidas en SQL Server

Las columnas calculadas en SQL Server pueden ser una herramienta poderosa para realizar cálculos y transformaciones en los datos dentro de una tabla. Sin embargo, el costo de calcular estas columnas en el momento de la consulta puede ser significativo, especialmente para conjuntos de datos grandes. Una forma de optimizar el rendimiento es convertir las columnas calculadas en persistidas, lo que traslada el costo de cálculo al momento de la inserción o actualización.

En este artículo, exploraremos cómo convertir columnas calculadas en persistidas en SQL Server y discutiremos algunas consideraciones importantes.

Convertir columnas calculadas en persistidas

El proceso de convertir columnas calculadas en persistidas es relativamente simple. Puede utilizar la declaración ALTER TABLE con la cláusula ALTER COLUMN para agregar la palabra clave PERSISTED a la definición de la columna. Aquí hay un ejemplo:

ALTER TABLE dbo.tablename 
  ALTER COLUMN columnname
  ADD PERSISTED;

Vale la pena señalar que puede ejecutar esta declaración varias veces sin ningún problema. SQL Server responderá con “El comando se completó correctamente” incluso si la columna ya está marcada como persistida.

Consideraciones para convertir columnas calculadas en persistidas

Antes de intentar convertir columnas calculadas en persistidas, hay algunas consideraciones importantes a tener en cuenta:

Columnas calculadas determinísticas

Solo se pueden marcar como persistidas las columnas calculadas determinísticas. Una función determinística siempre devuelve la misma salida para la misma entrada. Por ejemplo, la función GETDATE() no es determinística porque puede devolver un valor diferente cada vez que se llama. Por lo tanto, una columna calculada que utiliza GETDATE() no se puede marcar como persistida.

Puede utilizar la función COLUMNPROPERTY para determinar si una columna calculada es determinística. Aquí hay un ejemplo:

SELECT COLUMNPROPERTY(OBJECT_ID(N'dbo.table1'), N'Now', N'IsDeterministic');

Si el resultado es 1, la columna es determinística y potencialmente se puede marcar como persistida.

Funciones definidas por el usuario

Las columnas calculadas que utilizan funciones definidas por el usuario pueden no estar marcadas como persistidas de forma predeterminada. SQL Server considera que las funciones definidas por el usuario no son determinísticas a menos que se marquen explícitamente con la opción WITH SCHEMABINDING. Esta opción le indica a SQL Server que la función es determinística y se puede utilizar en columnas calculadas persistidas.

Aquí hay un ejemplo de una función definida por el usuario con y sin la opción WITH SCHEMABINDING:

CREATE FUNCTION dbo.udf1(@id INT)
RETURNS INT 
AS
BEGIN
  RETURN (SELECT @id + 1);
END

CREATE FUNCTION dbo.udf2(@id INT)
RETURNS INT 
WITH SCHEMABINDING
AS
BEGIN
  RETURN (SELECT @id + 1);
END

Solo la segunda función, dbo.udf2, se puede utilizar en una columna calculada persistida.

Configuración ANSI_NULLS

La configuración ANSI_NULLS también puede afectar la capacidad de marcar columnas calculadas como persistidas. Si una tabla se creó con ANSI_NULLS OFF, es posible que encuentre problemas al intentar persistir columnas calculadas. Para evitar esto, vuelva a crear la tabla con ANSI_NULLS ON o evite persistir columnas calculadas en tablas con ANSI_NULLS OFF.

Conclusión

La conversión de columnas calculadas en persistidas en SQL Server puede mejorar significativamente el rendimiento de las consultas al trasladar el costo de cálculo al momento de la inserción o actualización. Sin embargo, hay varias consideraciones a tener en cuenta, como la determinismo de las columnas calculadas y el uso de funciones definidas por el usuario. Al comprender estas consideraciones y utilizar las técnicas adecuadas, puede optimizar el rendimiento de su base de datos de SQL Server.

En un artículo futuro, exploraremos el impacto de hacer que una columna sea persistida en tablas grandes y cuando la definición de la columna hace referencia a funciones definidas por el usuario costosas. También discutiremos cómo determinar si una función es no determinística o si se necesita la opción WITH SCHEMABINDING.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.