Me cuesta encontrar documentación sobre cómo SQL Server realmente almacena una columna calculada no persistente.
Tome el siguiente ejemplo:
--SCHEMA
CREATE TABLE dbo.Invoice
(
InvoiceID INT IDENTITY(1, 1) PRIMARY KEY,
CustomerID INT FOREIGN KEY REFERENCES dbo.Customer(CustomerID),
InvoiceStatus NVARCHAR(50) NOT NULL,
InvoiceStatusID AS CASE InvoiceStatus
WHEN 'Sent' THEN 1
WHEN 'Complete' THEN 2
WHEN 'Received' THEN 3
END
)
GO
--INDEX
CREATE NONCLUSTERED INDEX IX_Invoice ON Invoice
(
CustomerID ASC
)
INCLUDE
(
InvoiceStatusID
)
GO
Entiendo que se almacena a nivel de hoja, pero si el valor no se conserva, ¿cómo se almacena algo? ¿Cómo ayuda el índice a SQL Server a encontrar estas filas en esta situación?
Cualquier ayuda muy apreciada,
Muchas gracias,
EDITAR:
Gracias a Brent y Aaron por responder esto, aquí está el PasteThePlan que muestra claramente lo que explicaron.
sql-server
sql-server-2012
index
computed-column
Uberzen1
fuente
fuente
Respuestas:
Cuando SQL Server crea el índice en el campo calculado, el campo calculado se escribe en el disco en ese momento, pero solo en las páginas de 8K de ese índice. SQL Server puede calcular el InvoiceStatusID a medida que lee el índice agrupado; no es necesario escribir esos datos en el índice agrupado.
A medida que borra / actualiza / inserta filas en dbo.Invoice, los datos en los índices se mantienen actualizados. (Cuando InvoiceStatus cambia, SQL Server también debe actualizar IX_Invoice).
La mejor manera de ver esto es hacerlo: crear estos objetos y ejecutar actualizaciones que toquen el campo InvoiceStatusID. Publique el plan de ejecución (PasteThePlan.com es útil para esto) si desea ayuda para ver dónde están ocurriendo las actualizaciones del índice.
fuente
El valor de una columna calculada indexada y no persistente no se conserva en las páginas de datos de la tabla , pero sí en las páginas del índice . Permanece sin persistencia en la tabla, independientemente de si persiste en 0, 1 o múltiples índices.
Solo para ilustrar la descripción de Brent, tomando el ejemplo que dio, insertemos una fila:
Ahora, veamos las páginas de índice:
(Obviamente
dbname
, cambie , y la ID del índice podría no ser 2 en su caso).Salida (la suya seguramente será diferente):
Y finalmente, inspeccionemos la página para
PageType
2:(Es probable que necesite cambiar 7 para que coincida con la identificación de su base de datos, y si tiene varios archivos de datos, es posible que deba cambiar el segundo argumento para que coincida
PageFID
con el primer resultado).Salida:
Eso está en la página de índice.
fuente
El atributo
PERSISTED
para una columna calculada se refiere a si los valores persisten en la tabla (índice agrupado o montón) y no a si los valores persisten en el índice.El
CREATE INDEX
tiene los requisitos para las limitaciones en cuanto a las columnas y los índices calculados:No hay limitación sobre si la columna calculada es persistente o no.
y más (no se trata de columnas incluidas sino de columnas calculadas en la parte principal de un índice):
fuente