Странное поведение с вычисляемыми столбцами в SQL-сервере

12

Читая мою экзаменационную книгу 70–433, я подумал о том, что, как я вижу, не работает, но я верю, что оно работает. Отрывок читал что-то вроде:

Столбец также должен быть помечен как PERSISTED , что означает, что SQL Server физически сохраняет результат выражения вычисляемого столбца в строке данных, а не вычисляет его каждый раз, когда на него ссылаются в запросе.

Из этого я понимаю две вещи:

  1. Не-упорствовано вычисляемый столбец вычисляется каждый раз, когда он ссылается в запросе
  2. Поскольку для вычисляемого столбца ничего не сохраняется, я предполагаю, что для столбца нельзя создать индекс.

Прочитав его, я подумал, что это немного странно, поскольку мне удалось создать индекс для непостоянного столбца в предыдущем проекте.

Как создать индекс для чего-то, что не сохраняется, и наносит ли это ущерб в долгосрочной перспективе?


Чтобы доказать это, я запустил следующий оператор 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;

Посмотрев на план запроса для приведенного выше кода, я вижу, что оба запроса на выборку используют непостоянный индекс. Опять как?

введите описание изображения здесь

Стюарт Блэклер
источник
Для тех, у кого есть книга 70-433, цитируемый текст находится вверху страницы 111.
Стюарт Блэклер

Ответы:

9

2. Поскольку для вычисляемого столбца ничего не сохраняется, я предполагаю, что для столбца не может быть создан индекс.

Это предположение неверно - любой вид может быть проиндексирован . Вычисляемый столбец должен быть детерминированным в любом случае, но когда вычисляемый столбец сохраняется, требование о том, что вычисление также является точным , смягчается (т. Е. Может включать операции с плавающей запятой).

Как создать индекс для чего-то, что не сохраняется, и наносит ли это ущерб в долгосрочной перспективе?

Результат функции «сохраняется» в индексе в любом случае - единственное отличие состоит в том, сохраняется ли она в таблице.

Джек говорит, попробуйте topanswers.xyz
источник