Читая мою экзаменационную книгу 70–433, я подумал о том, что, как я вижу, не работает, но я верю, что оно работает. Отрывок читал что-то вроде:
Столбец также должен быть помечен как PERSISTED , что означает, что 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;
Посмотрев на план запроса для приведенного выше кода, я вижу, что оба запроса на выборку используют непостоянный индекс. Опять как?
источник
Ответы:
Это предположение неверно - любой вид может быть проиндексирован . Вычисляемый столбец должен быть детерминированным в любом случае, но когда вычисляемый столбец сохраняется, требование о том, что вычисление также является точным , смягчается (т. Е. Может включать операции с плавающей запятой).
Результат функции «сохраняется» в индексе в любом случае - единственное отличие состоит в том, сохраняется ли она в таблице.
источник