Trabajar con SQL Server a veces puede presentar desafíos cuando se trata de optimizar el rendimiento. En este artículo, exploraremos el concepto de columnas persistidas y cómo se pueden utilizar para mejorar el rendimiento de las consultas.
Consideremos un escenario en el que tenemos un procedimiento almacenado que incluye una función definida por el usuario (UDF) escalar en la cláusula WHERE. Normalmente, usaríamos una función de tabla de valores en línea para obtener un mejor rendimiento. Sin embargo, en este caso particular, no es una opción viable.
Para optimizar la consulta, podemos aprovechar las columnas persistidas. Una columna persistida es una columna calculada que se almacena físicamente en el disco, lo que permite una recuperación más rápida de los datos. En nuestro ejemplo, tenemos una tabla llamada “salesorderheader” con una columna llamada “rowguid” que necesita ser limpiada utilizando la UDF “udfCleanGuid”.
Primero, creamos un índice en la columna “BillToAddressID”, incluyendo la columna “rowguid”:
CREATE INDEX idxBill ON sales.salesorderheader(BillToAddressID) INCLUDE (rowguid)A continuación, agregamos una columna persistida llamada “CleanedGuid” a la tabla “salesorderheader”, que aplica la UDF a la columna “rowguid”:
ALTER TABLE sales.salesorderheader ADD CleanedGuid AS dbo.udfCleanGuid(rowguid) PERSISTEDAhora, cuando ejecutamos la instrucción SELECT, podemos ver que el plan de consulta sigue siendo relativamente sin cambios. Los datos persistidos no se están utilizando y la UDF se sigue recalculando para cada fila.
Para solucionar este problema, debemos modificar el índice para incluir la columna “CleanedGuid”:
DROP INDEX Sales.SalesOrderHeader.idxBill
CREATE INDEX idxBill ON sales.salesorderheader(BillToAddressID) INCLUDE (rowguid, cleanedguid)Al incluir la columna “CleanedGuid” en el índice, eliminamos la necesidad de recalcular la UDF para cada fila. Ahora, cuando ejecutamos la instrucción SELECT, podemos ver que se está utilizando los datos persistidos, lo que resulta en una mejora en el rendimiento de la consulta.
Es importante tener en cuenta que el motor del optimizador no siempre elige utilizar los datos persistidos. En nuestro ejemplo, el optimizador determinó que recalcular la UDF era más barato que realizar una búsqueda. Esto resalta la necesidad de considerar cuidadosamente el costo de las UDF escalares y su impacto en el rendimiento de la consulta.
En conclusión, al trabajar con SQL Server, aprovechar las columnas persistidas puede ser una técnica valiosa para optimizar el rendimiento de las consultas. Al incluir la columna persistida en el índice, podemos evitar la necesidad de costosos recálculos de UDF y mejorar el tiempo de ejecución general de la consulta.