Czytając książkę do egzaminu 70-433, pomyślałem o czymś, co nie działa, ale wierzę, że tak. Fragment brzmiał mniej więcej tak:
Kolumna musi być również oznaczona jako PERSISTED , co oznacza, że SQL Server fizycznie przechowuje wynik wyrażenia kolumny obliczeniowej w wierszu danych, zamiast obliczać go za każdym razem, gdy odwołuje się do niego w zapytaniu.
Z tego rozumiem dwie rzeczy:
- Nie utrzymywały kolumna obliczana jest obliczany za każdym razem, że jest on wymieniony w zapytaniu
- Ponieważ nic nie jest przechowywane dla kolumny obliczanej, zakładam, że nie można utworzyć indeksu dla kolumny.
Po przeczytaniu pomyślałem, że to trochę dziwne, ponieważ udało mi się utworzyć indeks na nietrwałej kolumnie w poprzednim projekcie.
Jak można utworzyć indeks dla czegoś, co nie zostanie utrwalone i czy na dłuższą metę jest to szkodliwe?
Aby to udowodnić, uruchomiłem następującą instrukcję SQL:
CREATE TABLE testTable
(
ID INT IDENTITY(1,1) PRIMARY KEY,
telephone VARCHAR(14),
c_areaCode AS (SUBSTRING(telephone,0,5)),
cp_areaCode AS (SUBSTRING(telephone,0,5)) PERSISTED
)
INSERT INTO testTable VALUES('09823 000000');
INSERT INTO testTable VALUES('09824 000000');
INSERT INTO testTable VALUES('09825 000000');
CREATE NONCLUSTERED INDEX IX_NotPersisted ON testTable(c_areaCode);
CREATE NONCLUSTERED INDEX IX_Persisted ON testTable(cp_areaCode);
A następnie uruchom następujące zapytania:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;
Po zapoznaniu się z planem zapytań dla powyższego kodu widzę, że oba wybrane zapytania używają nietrwałego indeksu. Znowu jak?