¿Cuándo se determinan los valores para las columnas calculadas?
- Cuando se recupera el valor?
- Cuando se cambia el valor?
- ¿En otro momento?
Supongo que esta es una pregunta novata ya que no encuentro nada en mis búsquedas.
sql-server
computed-column
Shelby115
fuente
fuente
Esto es muy fácil de probar por su cuenta. Podemos crear una tabla con una columna calculada que use una función escalar definida por el usuario, y luego verificar los planes y las estadísticas de la función antes y después de una actualización y selección, y ver cuándo se registra una ejecución.
Digamos que tenemos esta función:
Y esta tabla:
Verifiquemos
sys.dm_exec_function_stats
(nuevo en SQL Server 2016 y Azure SQL Database) antes y después de una inserción, y luego después de una selección:No veo ninguna llamada a la función en la inserción, solo en la selección.
Ahora, suelte las tablas y vuelva a hacerlo, esta vez cambiando la columna a
PERSISTED
:Y veo que sucede lo contrario: obtengo una ejecución registrada en la inserción, pero no en la selección.
¿No tiene una versión suficientemente moderna de SQL Server para usar
sys.dm_exec_function_stats
? No se preocupe, esto también está capturado en los planes de ejecución .Para la versión no persistente, podemos ver la función referenciada solo en select:
Si bien la versión persistente solo muestra el cálculo que ocurre en la inserción:
Ahora, Martin menciona un gran punto en un comentario : esto no siempre será cierto. Creemos un índice que no cubra la columna calculada persistente, y ejecutemos una consulta que use ese índice, y veamos si la búsqueda obtiene los datos de los datos persistentes existentes, o calcula los datos en tiempo de ejecución (función drop and re-create) y tabla aquí):
Ahora, ejecutaremos una consulta que use el índice (de todos modos, en realidad, usa el índice en este caso específico, incluso sin una cláusula where):
Veo ejecuciones adicionales en las estadísticas de funciones, y el plan no miente:
Entonces, la respuesta es DEPENDE . En este caso, SQL Server pensó que sería más barato volver a calcular los valores que realizar búsquedas. Esto podría cambiar debido a una variedad de factores, así que no confíes en él. Y esto puede suceder en cualquier dirección, se use o no una función definida por el usuario; Solo lo usé aquí porque lo hizo mucho más fácil de ilustrar.
fuente
La respuesta a esta pregunta realmente es "depende". Acabo de encontrar un ejemplo en el que SQL Server está utilizando el índice en la columna calculada persistente, pero aún realiza la función, como si los valores nunca hubieran sido persistentes. Es posible que tenga que ver con el tipo de datos de la columna (
nvarchar(37)
) o posiblemente con el tamaño de la tabla (aproximadamente 7 millones de filas), pero SQL Server decidió ignorar elpersisted
palabra clave, al parecer, en este caso particular.En este caso, la clave principal de la tabla es TransactionID, que también es una columna calculada y persistente. El plan de ejecución está generando un escaneo de índice y en una tabla con solo 7 millones de filas, esta consulta simple tarda más de 2-3 minutos en ejecutarse porque la función se ejecuta nuevamente en cada fila y los valores no parecen persistir en El índice.
fuente