Usiłuję znaleźć jakąkolwiek dokumentację dotyczącą tego, jak SQL Server faktycznie przechowuje nietrwałą kolumnę obliczeniową.
Weź następujący przykład:
--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
Rozumiem, że jest przechowywany na poziomie liścia, ale jeśli wartość nie zostanie utrwalona, w jaki sposób w ogóle coś jest przechowywane? W jaki sposób indeks pomaga SQL Serverowi znaleźć te wiersze w tej sytuacji?
Każda pomoc bardzo doceniana,
Wielkie dzięki,
EDYTOWAĆ:
Dzięki Brentowi i Aaronowi za odpowiedź na to pytanie , oto PasteThePlan wyraźnie pokazujący, co wyjaśnili.
sql-server
sql-server-2012
index
computed-column
Uberzen1
źródło
źródło
Odpowiedzi:
Kiedy SQL Server tworzy indeks na polu obliczeniowym, pole obliczane jest zapisywane na dysk w tym czasie - ale tylko na stronach 8K tego indeksu. SQL Server może obliczyć InvoiceStatusID podczas odczytywania indeksu klastrowanego - nie ma potrzeby zapisywania tych danych w indeksie klastrowym.
Gdy usuwasz / aktualizujesz / wstawiasz wiersze w dbo.Faktura, dane w indeksach są aktualizowane. (Gdy zmienia się InvoiceStatus, SQL Server wie również o aktualizacji IX_Invoice.)
Najlepszym sposobem, aby to zobaczyć, jest zrobienie tego: utworzenie tych obiektów i wykonanie aktualizacji, które dotykają pola InvoiceStatusID. Opublikuj plan wykonania (PasteThePlan.com jest do tego pomocny), jeśli chcesz dowiedzieć się, gdzie mają miejsce aktualizacje indeksu.
źródło
Wartość zindeksowanej, nietrwałej kolumny obliczeniowej nie jest utrwalana na stronach danych tabeli , ale jest utrwalana na stronach indeksu . Pozostaje nietrwały w tabeli, niezależnie od tego, czy jest utrwalony w 0, 1 czy w wielu indeksach.
Aby zilustrować opis Brenta, biorąc podany przez ciebie przykład, wstawmy wiersz:
Zobaczmy teraz strony indeksu:
(Oczywiście zmieniają się
dbname
, a identyfikator indeksu może nie być w twoim przypadku 2).Dane wyjściowe (twoje na pewno będą się różnić):
Na koniec sprawdźmy stronę pod kątem
PageType
2:(Prawdopodobnie będziesz musiał zmienić 7, aby dopasować identyfikator bazy danych, a jeśli masz wiele plików danych, może być konieczna zmiana drugiego argumentu, aby pasował
PageFID
do pierwszego wyniku).Wynik:
To jest na stronie indeksu.
źródło
Atrybut
PERSISTED
kolumny obliczanej odnosi się do tego, czy wartości są utrwalane w tabeli (indeks klastrowany lub sterta), a nie od tego, czy wartości są utrwalane w indeksie.CREATE INDEX
Ma wymagań dotyczących ograniczeń dotyczących obliczonych kolumn i indeksów:Nie ma ograniczeń co do tego, czy kolumna obliczana jest utrwalona, czy nie.
i dalej (nie o uwzględnionych, ale o obliczonych kolumnach w głównej części indeksu):
źródło