Разрешение индексов для представлений

SQL Server использует индексированное представление, как и индекс, в плане запроса только в том случае, если оптимизатор запросов определит, что получит от этого выигрыш.

Индексированные представления можно создавать в любом выпуске SQL Server. В SQL Server Enterprise оптимизатор запросов учитывает индексированные представления автоматически. Чтобы использовать индексированные представления в любых других выпусках, следует применить табличную подсказку NOEXPAND.

Оптимизатор запросов SQL Server пользуется индексированными представлениями при соблюдении следующих условий:

  • Следующие параметры сеанса установлены в значение ON:

    • ANSI_NULLS

    • ANSI_PADDING

    • ANSI_WARNINGS

    • ARITHABORT

    • CONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIER

    • Параметр сеанса NUMERIC_ROUNDABORT установлен в значение OFF.

  • Оптимизатор запросов находит соответствие между столбцами индексированного представления и элементами запроса, например:

    • предикатами условия поиска в предложении WHERE;

    • операциями соединения;

    • статистическими функциями;

    • предложениями GROUP BY;

    • ссылками на таблицы.

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

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

    ПримечаниеПримечание

    Подсказки READCOMMITTED и READCOMMITTEDLOCK в данном контексте всегда рассматриваются как разные, независимо от уровня изоляции текущей транзакции.

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

Запрос необязательно должен ссылаться в предложении FROM на индексированное представление, чтобы оптимизатор запросов его использовал. Если запрос ссылается на столбцы в базовой таблице, которые также присутствуют в индексированном представлении, и оптимизатор запросов определяет, что индексированное представление будет иметь самую низкую стоимость механизма доступа, он применит индексированное представление точно так же, как он применяет индекс базовой таблицы, если на него отсутствуют прямые ссылки в запросе. Оптимизатор запросов может применить представление и в том случае, если оно содержит столбцы, на которые не ссылается запрос, если это представление обеспечивает самую низкую стоимость доступа к одному или нескольким столбцам, указанным в запросе.

Индексированное представление, указанное в предложении FROM, оптимизатор запросов рассматривает как стандартное представление. В начале процесса оптимизации оптимизатор запросов расширяет определение представления в запрос, а затем выполняет в индексированном представлении поиск соответствий. В окончательном плане выполнения, выбранном оптимизатором, может быть использовано индексированное представление, или же план может материализовать необходимые данные, производя доступ к базовым таблицам этого представления. Оптимизатором будет выбран вариант с наименьшей стоимостью.

Использование подсказок с индексированными представлениями

Можно избежать использования в запросе индексов представления, указав подсказку в запросе EXPAND VIEWS, либо при помощи табличной подсказки NOEXPAND принудительно задействовать индекс для индексированного представления, указанного в запросе в предложении FROM. Однако оптимизатору запросов следует разрешить динамически определять лучший метод доступа для каждого из запросов. Ограничьте применение подсказок EXPAND и NOEXPAND только теми случаями, когда очевидно, что они значительно повысят производительность.

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

Если для представления указана подсказка NOEXPAND, оптимизатор запросов предполагает использование всех индексов, определенных в представлении. Подсказка NOEXPAND может иметь необязательное предложение INDEX(), которое заставляет оптимизатор запросов пользоваться указанными индексами. Она может быть указана только для индексированного представления и не применяется для представлений, не имеющих индексов.

Если в запросе, содержащем представление, не заданы ни NOEXPAND, ни EXPAND VIEWS, это представление расширяется для доступа к базовым таблицам. Если запрос представления содержит какие-либо табличные подсказки, они распространяются на базовые таблицы. (Этот процесс подробно описан в разделе Разрешение представлений.) Пока подсказки, имеющиеся в базовых таблицах представления, идентичны, для запроса может устанавливаться соответствие с индексированным представлением. Чаще всего эти подсказки соответствуют друг другу, поскольку они наследуются непосредственно из представления. Однако если запрос ссылается на таблицы, а не на представления, и применяемые к этим таблицам подсказки неидентичны, то для такого запроса соответствие с индексированным представлением устанавливаться не может. Если подсказки INDEX, PAGLOCK, ROWLOCK, TABLOCKX, UPDLOCK или XLOCK применяются к таблицам, на которые запрос ссылается после расширения представления, для этого запроса не может быть установлено соответствие с индексированным представлением.

Если табличная подсказка вида INDEX (index_val[ ,...n] ) ссылается на представление в запросе, а подсказка NOEXPAND не указана, подсказка индекса не обрабатывается. Конкретный индекс следует указывать через NOEXPAND.

Обычно, если оптимизатор запросов устанавливает соответствие индексированного представления запросу, все заданные в таблицах или представлениях запроса подсказки применяются непосредственно к индексированному представлению. Если оптимизатор запросов решил не использовать индексированное представление, все подсказки распространяются непосредственно на таблицы, на которые ссылается это представление. Дополнительные сведения см. в разделе Разрешение представлений. Это не относится к подсказкам соединения. Они применяются только в той исходной позиции запроса, где они указаны. Подсказки в соединении оптимизатором запросов при установке соответствия запроса индексированным представлениям не рассматриваются. Если план запроса использует индексированное представление, которое совпадает с частью запроса, содержащей подсказку соединения, последняя в данном плане не используется.

В SQL Server 2008 в определении индексированных представлений подсказки не допускаются. В режимах совместимости 80 и выше SQL Server пропускает подсказки при работе с определениями индексированных представлений и при выполнении содержащих их запросов. В режиме совместимости 80 использование подсказок в определениях индексированных представлений не вызывает ошибок синтаксиса — они просто пропускаются.