Ich habe Probleme, eine Dokumentation darüber zu finden, wie SQL Server eine nicht persistierte berechnete Spalte tatsächlich speichert.
Nehmen Sie das folgende Beispiel:
--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
Ich verstehe, dass es auf Blattebene gespeichert ist, aber wenn der Wert nicht beibehalten wird, wie wird überhaupt etwas gespeichert? Wie hilft der Index SQL Server in dieser Situation, diese Zeilen zu finden?
Jede Hilfe sehr geschätzt,
Danke vielmals,
BEARBEITEN:
Vielen Dank an Brent & Aaron für die Beantwortung dieser Frage. Hier ist der PasteThePlan, der deutlich zeigt, was sie erklärt haben.
sql-server
sql-server-2012
index
computed-column
Uberzen1
quelle
quelle
Antworten:
Wenn SQL Server den Index für das berechnete Feld erstellt, wird das berechnete Feld zu diesem Zeitpunkt auf die Festplatte geschrieben - jedoch nur auf den 8-KB-Seiten dieses Index. SQL Server kann die InvoiceStatusID beim Lesen des Clustered-Index berechnen. Diese Daten müssen nicht in den Clustered-Index geschrieben werden.
Beim Löschen / Aktualisieren / Einfügen von Zeilen in dbo.Invoice werden die Daten in den Indizes auf dem neuesten Stand gehalten. (Wenn sich InvoiceStatus ändert, kann SQL Server auch IX_Invoice aktualisieren.)
Der beste Weg, dies selbst zu sehen, besteht darin, dies tatsächlich zu tun: Erstellen Sie diese Objekte und führen Sie Aktualisierungen aus, die das Feld InvoiceStatusID berühren. Veröffentlichen Sie den Ausführungsplan (PasteThePlan.com ist hierfür hilfreich), wenn Sie Hilfe benötigen, um zu sehen, wo die Indexaktualisierungen stattfinden.
quelle
Der Wert für eine indizierte, nicht persistierte berechnete Spalte wird nicht auf den Datenseiten der Tabelle , sondern auf den Seiten des Index beibehalten . Es bleibt in der Tabelle nicht erhalten, unabhängig davon, ob es in 0, 1 oder mehreren Indizes beibehalten wird.
Um die Beschreibung von Brent anhand des von Ihnen angegebenen Beispiels zu veranschaulichen, fügen wir eine Zeile ein:
Schauen wir uns nun die Indexseiten an:
(Offensichtlich ändern
dbname
, und die Index-ID ist in Ihrem Fall möglicherweise nicht 2.)Ausgabe (Ihre wird sich sicherlich unterscheiden):
Und zum Schluss untersuchen wir die Seite auf
PageType
2:(Sie müssen wahrscheinlich 7 ändern, um mit Ihrer Datenbank-ID übereinzustimmen. Wenn Sie mehrere Datendateien haben, müssen Sie möglicherweise das zweite Argument so ändern, dass es mit
PageFID
dem ersten Ergebnis übereinstimmt .)Ausgabe:
Das steht auf der Indexseite.
quelle
Das Attribut
PERSISTED
für eine berechnete Spalte bezieht sich darauf, ob die Werte in der Tabelle (Clustered-Index oder Heap) beibehalten werden und nicht, ob die Werte im Index beibehalten werden.Das
CREATE INDEX
hat die Anforderungen für die Einschränkungen in Bezug auf berechnete Spalten und Indizes:Es gibt keine Einschränkung, ob die berechnete Spalte beibehalten wird oder nicht.
und weiter (nicht über eingeschlossene, sondern über berechnete Spalten im Hauptteil eines Index):
quelle