J'ai du mal à trouver une documentation sur la façon dont SQL Server stocke réellement une colonne calculée non persistante.
Prenons l'exemple suivant:
--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
J'obtiens qu'il est stocké au niveau de la feuille, mais si la valeur n'est pas persistante, comment est-ce que quoi que ce soit est stocké? Comment l'index aide-t-il SQL Server à trouver ces lignes dans cette situation?
Toute aide grandement appréciée,
Merci beaucoup,
ÉDITER:
Merci à Brent & Aaron d'avoir répondu à cette question, voici le PasteThePlan montrant clairement ce qu'ils ont expliqué.
Réponses:
Lorsque SQL Server crée l'index sur le champ calculé, le champ calculé est écrit sur le disque à ce moment-là, mais uniquement sur les 8 000 pages de cet index. SQL Server peut calculer l'InvoiceStatusID lors de la lecture de l'index clusterisé - il n'est pas nécessaire d'écrire ces données dans l'index clusterisé.
Lorsque vous supprimez / mettez à jour / insérez des lignes dans dbo.Invoice, les données des index sont tenues à jour. (Lorsque InvoiceStatus change, SQL Server sait également mettre à jour IX_Invoice.)
La meilleure façon de voir cela par vous-même est de le faire: créez ces objets et exécutez des mises à jour qui touchent le champ InvoiceStatusID. Publiez le plan d'exécution (PasteThePlan.com est utile pour cela) si vous voulez de l'aide pour voir où les mises à jour d'index se produisent.
la source
La valeur d'une colonne calculée indexée et non persistante n'est pas persistante dans les pages de données de la table , mais elle est persistante dans les pages de l' index . Elle reste non persistante dans la table, qu'elle soit persistante dans 0, 1 ou plusieurs index.
Pour illustrer la description de Brent, en prenant l'exemple que vous avez donné, insérons une ligne:
Voyons maintenant les pages d'index:
(Évidemment, changez
dbname
, et l'ID d'index peut ne pas être 2 dans votre cas.)Sortie (la vôtre sera sûrement différente):
Et enfin, examinons la page pour
PageType
2:(Vous devrez probablement changer 7 pour correspondre à votre ID de base de données, et si vous avez plusieurs fichiers de données, vous devrez peut-être modifier le deuxième argument pour qu'il corresponde
PageFID
au premier résultat.)Production:
C'est sur la page d'index.
la source
L'attribut
PERSISTED
d'une colonne calculée est lié à la persistance des valeurs dans la table (index cluster ou segment de mémoire) et non à la persistance des valeurs dans l'index.Le
CREATE INDEX
a les exigences pour les limitations concernant les colonnes et les index calculés:Il n'y a aucune limitation quant à la persistance ou non de la colonne calculée.
et plus loin (pas sur les colonnes incluses mais sur les colonnes calculées dans la partie principale d'un index):
la source