Las tres SELECT
declaraciones en este código
USE [tempdb];
GO
SET NOCOUNT ON;
CREATE TABLE dbo.persist_test (
id INT NOT NULL
, id5 AS (id * 5)
, id5p AS (id * 5) PERSISTED
);
INSERT INTO dbo.persist_test (id)
VALUES (1), (2), (3);
SELECT id
FROM dbo.persist_test;
SELECT id5
FROM dbo.persist_test;
SELECT id5p
FROM dbo.persist_test;
DROP TABLE dbo.persist_test;
generar este plan:
¿Por qué el final SELECT
, que está seleccionando un valor persistente, genera un operador Compute Scalar ?
sql-server
sql-server-2008
execution-plan
Nick Chammas
fuente
fuente
[tempdb].[dbo].[persist_test].id
y calcula el valor a pesar de ser persistente.Respuestas:
Solo para resumir los hallazgos experimentales en los comentarios, este parece ser un caso marginal que ocurre cuando tiene dos columnas calculadas en la misma tabla, una
persisted
y una no persisten y ambas tienen la misma definición.En el plan para la consulta
La exploración de tabla
persist_test
solo emite laid
columna. El siguiente escalar de cálculo lo multiplica por 5 y genera una columna llamada aid5
pesar del hecho de que esta columna ni siquiera está referenciada en la consulta. El escalar de cómputo final toma el valor deid5
y lo genera como una columna llamadaid5p
.Uso de los indicadores de seguimiento explicados en Query Optimizer Deep Dive - Parte 2 (descargo de responsabilidad: estos indicadores de seguimiento no están documentados / no son compatibles) y observa la consulta
Da la salida
Árbol antes de la normalización del proyecto
Árbol después de la normalización del proyecto
Por lo tanto, parece que todas las definiciones de columnas calculadas se expanden y luego, durante la etapa de normalización del proyecto, todas las expresiones idénticas se vuelven a combinar con las columnas calculadas y,
id5
en este caso, coinciden . es decir, no le da preferencia a lapersisted
columna.Si la tabla se vuelve a crear con la siguiente definición
Luego, una solicitud para cualquiera
id5
oid5p
será satisfecha al leer la versión persistente de los datos en lugar de hacer el cálculo en tiempo de ejecución, por lo que la coincidencia parece suceder (al menos en este caso) en el orden de las columnas.fuente