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
SELECT id5p
FROM dbo.persist_test;
La exploración de tabla persist_test
solo emite la id
columna. El siguiente escalar de cálculo lo multiplica por 5 y genera una columna llamada a id5
pesar del hecho de que esta columna ni siquiera está referenciada en la consulta. El escalar de cómputo final toma el valor de id5
y lo genera como una columna llamada id5p
.
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
SELECT id5,
id5p,
( id * 5 )
FROM dbo.persist_test
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606);
Da la salida
Árbol antes de la normalización del proyecto
LogOp_Project
LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002
AncOp_PrjList
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
AncOp_PrjEl COL: Expr1004
ScaOp_Arithmetic x_aopMult
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id
ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)
Árbol después de la normalización del proyecto
LogOp_Project
LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002
AncOp_PrjList
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
AncOp_PrjEl COL: Expr1004
ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5
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 la persisted
columna.
Si la tabla se vuelve a crear con la siguiente definición
CREATE TABLE dbo.persist_test (
id INT NOT NULL
, id5p AS (5 * id) PERSISTED
, id5 AS (5 * id)
);
Luego, una solicitud para cualquiera id5
o id5p
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.
[tempdb].[dbo].[persist_test].id
y calcula el valor a pesar de ser persistente.