Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу ИСиТ.docx
Скачиваний:
6
Добавлен:
07.02.2024
Размер:
1.07 Mб
Скачать

Вычисляемые столбцы

Индексы могут создаваться на вычисляемых столбцах. Вычисляемые столбцы могут иметь свойство PERSISTED - это значит, что компонент Database Engine хранит вычисленные значения в таблице и обновляет их при обновлении любых столбцов, от которых зависит вычисляемый столбец. Компонент Database Engine использует эти сохраняемые значения, когда создает индекс по столбцу и когда запрос обращается к индексу.

Для индексации вычисляемого столбца этот вычисляемый столбец должен быть детерминированным и точным. Детерминированные выражения каждый раз возвращают один и тот же результат, если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных. Недетерминированные выражения могут возвращать каждый раз разные результаты, даже если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных. К точным типам относятся точные числовые типы (целочисленные и десятичные), денежные типы, символьные строки и другие точные типы, перечисленные в модуле 3.

Для материализованных вычисляемых столбцов необходимо, чтобы следующие параметры SET имели значения, указанные выше в разделе «Обязательные параметры SET для индексированных представлений».

Вычисляемые столбцы, производные от типов данных image, ntext, text, varchar(max), nvarchar(max), varbinary(max) и xml, могут индексироваться как ключевые или включенные неключевые столбцы, если тип данных вычисляемого столбца приемлем как тип данных для ключевого столбца индекса или неключевого столбца. Если размер ключа индекса превышает 900 байт, выдается предупреждение.

Создание индекса на вычисляемом столбце может привести к ошибке в операциях вставки или обновления, которые до этого успешно выполнялись. Такое неудачное завершение возможно, если вычисляемый столбец вызывает арифметическую ошибку. Например, вычисляемый столбец "c" в следующей таблице вызывает арифметическую ошибку, но инструкция INSERT работает.

CREATE TABLE T (a int, b int, c AS a/b);

INSERT INTO T VALUES (1, 0);

Если же после создания таблицы создать индекс на вычисляемом столбце "c", та же инструкция INSERT будет заканчиваться ошибкой.

CREATE TABLE T (a int, b int, c AS a/b);

CREATE UNIQUE CLUSTERED INDEX IdxT ON T(c);

INSERT INTO T VALUES (1, 0);

Примеры:

Создание простого кластеризованного индекса

В примере создается некластеризованный индекс по столбцу CountryID таблицы Countries.

CREATE INDEX IX_Countries_CountryID

ON Countries (CountryID);

Создание составного некластеризованного индекса

В этом примере создается некластеризованный составной индекс по столбцам SalesQuota и SalesYTD таблицы Sales.SalesPerson.

CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD

ON Sales.SalesPerson (SalesQuota, SalesYTD);

Создание уникального некластеризованного индекса

В следующем примере создается уникальный некластеризованный индекс по столбцу Name таблицы Production.UnitMeasure. Индекс требует уникальности данных, вставляемых в столбец Name.

CREATE UNIQUE INDEX AK_UnitMeasure_Name

ON Production.UnitMeasure(Name);

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

SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';

GO

INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)

VALUES ('OC', 'Ounces', GetDate());

В результате выдается сообщение об ошибке:

Сервер: Сообщение 2601, уровень 14, состояние 1, строка 1

Невозможно вставить повторяющуюся строку ключей в объект UnitMeasure с уникальным индексом AK_UnitMeasure_Name. Выполнение данной инструкции было прервано.

Создание индекса с включенными (неключевыми) столбцами

В этом примере создается некластеризованный индекс с одним ключевым столбцом (PostalCode) и четырьмя неключевыми столбцами (AddressLine1, AddressLine2, City, StateProvinceID).

CREATE NONCLUSTERED INDEX IX_Address_PostalCode

ON Person.Address (PostalCode)

INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

Соседние файлы в предмете Информатика