70-433 sınav kitabımı okurken, çalışmadığını görebildiğim bir şey düşündüm, ama işe yaradığına inanıyorum. Passage şöyle bir şey okudu:
Sütun da PERSISTED olarak işaretlenmelidir ; bu, SQL Server'ın hesaplanan sütunun ifadesinin sonucunu, her sorguda başvurulduğunda hesaplamak yerine veri satırında fiziksel olarak depoladığı anlamına gelir.
Bundan iki şeyi anlıyorum:
- Bir kalıcı olmayan hesaplanan sütun bir sorgu başvurulan, her zaman hesaplanır
- Hesaplanan sütun için hiçbir şey saklanmadığından, sütun için hiçbir dizin oluşturulamayacağını varsayıyorum.
Okuduktan sonra, önceki bir projede kalıcı olmayan bir sütun üzerinde bir dizin oluşturmayı başardığım için bunun biraz garip olduğunu düşündüm.
Kalıcı olmayan bir şey için bir indeks nasıl oluşturulabilir ve bu uzun vadede zararlı mıdır?
Bunu kanıtlamak için aşağıdaki SQL deyimini çalıştırdım:
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);
Ve sonra aşağıdaki sorguları çalıştırın:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;
Yukarıdaki kod için sorgu planına baktıktan sonra, her iki seçme sorguları kalıcı olmayan dizini kullandığını görebilirsiniz. Yine nasıl?
