Индексы вычисляемых столбцов

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

Индексы вычисляемых столбцов можно определить, если удовлетворяются следующие требования:

  • требования к владению;
  • требования к детерминированности;
  • требования к точности;
  • требования к типам данных;
  • требования к параметру SET.

Заметка

SET QUOTED_IDENTIFIERON при создании или изменении индексов в вычисляемых столбцах или индексированных представлениях. Дополнительные сведения см. в статье 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 . включая логические выражения (сравнения).

Свойство IsPreciseCOLUMNPROPERTY функции сообщает, является ли computed_column_expression точным.

требования к типам данных;

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

требования к параметру SET.

  • Параметр ANSI_NULLS уровня подключения должен быть задан ONCREATE TABLE при выполнении вычисляемого столбца или ALTER TABLE инструкции. Функция OBJECTPROPERTY сообщает, включен ли параметр через IsAnsiNullsOn свойство.

  • Соединение, для которого создается индекс, и все соединения, пытающиеся или операторы, изменяющие INSERTUPDATEDELETE значения в индексе, должны иметь шесть SET параметров ON и один параметрOFF. Оптимизатор игнорирует индекс вычисляемого столбца для любой SELECT инструкции, выполняемой подключением, которое не имеет этих параметров параметров.

    Для NUMERIC_ROUNDABORT параметра должно быть задано OFFзначение , а для следующих параметров должно быть задано следующее:ON

    • ANSI_NULLS
    • ANSI_PADDING
    • ANSI_WARNINGS
    • ARITHABORT
    • CONCAT_NULL_YIELDS_NULL
    • QUOTED_IDENTIFIER

Заметка

Если ANSI_WARNINGS для уровня совместимости базы данных задано значение "Неявно", значение неявно задано ARITHABORTON90 или выше.ON

Создание индексов для сохраненных вычисляемых столбцов

Иногда можно создать вычисляемый столбец, определенный с помощью выражения, которое является детерминированным, но неточным. Это можно сделать, если столбец помечается PERSISTED в инструкции или ALTER TABLE инструкцииCREATE TABLE.

Это означает, что ядро СУБД сохраняет вычисляемые значения в таблице и обновляет их при обновлении других столбцов, от которых зависит вычисляемый столбец. Ядро СУБД использует эти сохраненные значения при создании индекса в столбце и при указании индекса в запросе.

Этот параметр позволяет создать индекс в вычисляемом столбце, если ядро СУБД не может быть доказано с точностью, является ли функция, которая возвращает вычисляемые выражения столбцов, особенно функцию CLR, созданную в .NET Framework, как детерминированную, так и точную.

Заметка

Невозможно создать отфильтрованный индекс в вычисляемом столбце.

Далее