Поки читав мою книгу іспитів 70-433, я подумав про те, що я можу побачити, що це не працює, але я вважаю, що це робить. Уривок читав щось на кшталт:
Стовпець також повинен бути позначений як ПЕРСИСТИЧНИЙ , що означає, що SQL Server фізично зберігає результат вираженого обчисленого стовпця в рядку даних, а не обчислює його щоразу, коли на нього посилається запит.
З цього я розумію дві речі:
- Ні-і бунтувалися обчислюваний стовпець обчислюється кожного разу, коли він посилається в запиті
- Оскільки для обчисленого стовпця нічого не зберігається, я припускаю, що жоден індекс не може бути створений для стовпця.
Прочитавши це, я подумав, що це було трохи дивно, оскільки мені вдалося створити індекс на непостійній колонці в попередньому проекті.
Як можна створити індекс для того, що не зберігається, і чи це це згубно в перспективі?
Щоб довести це, я запустив наступний оператор 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);
А потім запустіть такі запити:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;
Переглянувши план запитів вищевказаного коду, я можу побачити, що обидва обрані запити використовують неперсистуючий індекс. Знову, як?
