Индексы вычисляемых столбцов
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Индексы вычисляемых столбцов можно определить, если удовлетворяются следующие требования:
- требования к владению;
- требования к детерминированности;
- требования к точности;
- требования к типам данных;
- требования к параметру SET.
Примечание.
SET QUOTED_IDENTIFIER
ON
при создании или изменении индексов в вычисляемых столбцах или индексированных представлениях. Дополнительные сведения см. в статье SET QUOTED_IDENTIFIER (Transact-SQL).
требования к владению;
Все ссылки на функции в вычисляемом столбце должны иметь того же владельца, что и таблица.
требования к детерминированности;
Выражения являются детерминированными, если они всегда возвращают один и тот же результат для определенного набора входных данных. Свойство IsDeterministic
функции COLUMNPROPERTY сообщает, является ли computed_column_expression детерминированным.
Выражение computed_column_expression должно быть детерминированным. Выражение computed_column_expression является детерминированным, если соблюдается хотя бы одно из следующих условий.
Все функции, на которые ссылается выражение, являются детерминированными и точными. Это относится как к пользовательским, так и к встроенным функциям. Дополнительные сведения см. в разделе Deterministic and Nondeterministic Functions. Функции могут быть неуказанно, если вычисляемый столбец имеет значение
PERSISTED
. Дополнительные сведения см. в статье "Создание индексов для сохраненных вычисляемых столбцов в конце этой статьи".Все столбцы, на которые ссылается выражение, берутся из таблицы, содержащей вычисляемый столбец.
Ни одна ссылка на столбец не запрашивает данные из нескольких строк. Например, агрегированные функции, такие как
SUM
илиAVG
зависящие от данных из нескольких строк, и делают computed_column_expression недетерминированным.У выражения computed_column_expression нет доступа к системным данным или данным пользователя.
Любой вычисляемый столбец, содержащий выражение среды CLR, должен быть детерминированным и помечен PERSISTED
перед индексированием столбца. Выражения определяемого пользователем типа данных CLR допускаются в определениях вычисляемых столбцов. Вычисляемые столбцы, которые имеют определяемый пользователем тип данных CLR, могут быть индексированы, если этот тип сопоставим. Дополнительные сведения об определяемых пользователем типах данных CLR см. в разделе Определяемые пользователем типы данных CLR.
CAST и CONVERT
Если вы ссылаетесь на строковые литералы типа данных даты в индексированных вычисляемых столбцах в SQL Server, рекомендуется явно преобразовать литерал в тип даты, который требуется с помощью детерминированного стиля формата даты. Список детерминированных стилей форматирования даты см. в разделе CAST и CONVERT.
Дополнительные сведения см. в статье Недетерминированное преобразование строк дат литералов в значения DATE.
Уровень совместимости
Неявное преобразование символьных данных, отличных от Юникода, между параметрами сортировки считается недетерминированным, если уровень совместимости не задан 80
или более ранний.
Если задан уровень 90
совместимости базы данных, нельзя создавать индексы для вычисляемых столбцов, содержащих эти выражения. Это, однако, не относится к существующим вычисляемым столбцам, содержащим такие выражения из обновленной базы данных. Если вы используете индексированные вычисляемые столбцы, содержащие неявную строку на дату преобразования, чтобы избежать возможной повреждения индекса, убедитесь, что LANGUAGE
в базах данных и приложениях согласованы параметры DATEFORMAT
и параметры.
Уровень 90
совместимости соответствует SQL Server 2005 (9.x).
требования к точности;
Выражение computed_column_expression должно быть точным. Выражение computed_column_expression является точным, если соблюдается одно или несколько следующих условий:
Это не выражение типов данных с плавающей запятой или реальными .
Он не использует тип данных float или real в определении. Например, в следующей инструкции столбец
y
имеет тип int и является детерминированным, но неточным.CREATE TABLE t2 (a int, b int, c int, x float, y AS CASE x WHEN 0 THEN a WHEN 1 THEN b ELSE c END);
Примечание.
Любое выражение, которое имеет тип данных float или real , считается неточным и не может быть ключом индекса; выражения, которые имеют тип float или real , могут использоваться в индексированном представлении, но не в качестве ключа. Это верно и для вычисляемых столбцов. Любая функция, выражение или определяемая пользователем функция считается неточной, если содержит какие-либо выражения с типом данных float или real . включая логические выражения (сравнения).
Свойство IsPrecise
COLUMNPROPERTY
функции сообщает, является ли computed_column_expression точным.
требования к типам данных;
- Computed_column_expression, определенный для вычисляемого столбца, не может оцениваться типами данных текста, ntext или изображения.
- Вычисляемые столбцы, производные от типов данных image, ntext, text, varchar(max), nvarchar(max), varbinary(max)и xml , могут индексироваться, если тип данных вычисляемого столбца допускается в качестве ключевого столбца индекса.
- Вычисляемые столбцы, производные от типов данных image, ntextи text , могут быть неключевыми (включенными) столбцами некластеризованного индекса, если тип данных вычисляемого столбца является допустимым в качестве неключевого индексного столбца.
требования к параметру SET.
Параметр
ANSI_NULLS
уровня подключения должен быть заданON
CREATE TABLE
при выполнении вычисляемого столбца илиALTER TABLE
инструкции. Функция OBJECTPROPERTY сообщает, включен ли параметр черезIsAnsiNullsOn
свойство.Соединение, для которого создается индекс, и все соединения, пытающиеся или операторы, изменяющие
INSERT
UPDATE
DELETE
значения в индексе, должны иметь шестьSET
параметровON
и один параметрOFF
. Оптимизатор игнорирует индекс вычисляемого столбца для любойSELECT
инструкции, выполняемой подключением, которое не имеет этих параметров параметров.Для
NUMERIC_ROUNDABORT
параметра должно быть заданоOFF
значение , а для следующих параметров должно быть задано следующее:ON
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
Примечание.
Если ANSI_WARNINGS
для уровня совместимости базы данных задано значение "Неявно", значение неявно задано ARITHABORT
ON
90
или выше.ON
Создание индексов для сохраненных вычисляемых столбцов
Иногда можно создать вычисляемый столбец, определенный с помощью выражения, которое является детерминированным, но неточным. Это можно сделать, если столбец помечается PERSISTED
в инструкции или ALTER TABLE
инструкцииCREATE TABLE
.
Это означает, что ядро СУБД сохраняет вычисляемые значения в таблице и обновляет их при обновлении любых других столбцов, от которых зависит вычисляемый столбец. Ядро СУБД использует эти сохраненные значения при создании индекса в столбце и при ссылке на индекс в запросе.
Этот параметр позволяет создать индекс в вычисляемом столбце, если ядро СУБД не может доказать точность функции, возвращающей вычисляемые выражения столбцов, особенно функцию CLR, созданную в платформа .NET Framework, является детерминированной и точной.
Примечание.
Невозможно создать отфильтрованный индекс в вычисляемом столбце.