Создание индексированного представления является процессом, состоящим из двух шагов.
1. Создайте представление, используя оператор create view с предложением with schemabinding.
2. Создайте соответствующий кластеризованный индекс.
В примере 11.19 показан первый шаг создания типичного представления, которое может быть индексировано для улучшения производительности. Этот пример предполагает, что таблица workson имеет очень большой размер.
Таблица workson в базе данных sample содержит столбец enterdate, который представляет дату начала работы служащего с проектом. Если вам нужно найти всех служащих, которые начали работать с их проектами в конкретном месяце, вы можете использовать представление в примере 11.19. Для поиска подобного результирующего набора с использованием доступа через индекс Database Engine не может применить индекс таблицы, потому что индекс для столбца enter_date может локализовать значения этого столбца только по полной дате, а не по месяцу. В таком случае может помочь индексированное представление, как показано в примере 11.20.
Для того чтобы сделать представление индексированным, вы должны создать уникальный кластеризованный индекс для столбца (столбцов) представления. (Как ранее уже было сказано, кластеризованный индекс является только лишь типом индекса, который содержит значения данных в своих страницах листьев.) После того как вы создадите такой индекс, система базы данных выделит память для этого представления, а затем вы можете создавать любое количество некластеризованных индексов, потому что теперь это представление трактуется как (базовая) таблица.
Индексированное представление может быть создано только в том случае, если установлены в on следующие опции оператора set (потому что представление всегда должно отображать тот же самый результирующий набор):
♦ quoted_identifier;
♦ concat_null_yields_null;
♦ ansi_nulls;
♦ ansi_padding;
♦ ansi_warnings.
Также и опция numeric_roundabort должна быть установлена в off.
Есть несколько способов проверить, имеют ли опции из предыдущего списка нужные значения, как обсуждалось в разд. «Редактирование информации, связанной с представлениями» ранее В этом разделе.
Для создания индексированного представления определение представления должно отвечать следующим требованиям.
♦ Все ссылки на функции (системные или определенные пользователем), используемые в представлении, должны быть детерминированными - они всегда должны возвращать один и тот же результат для одних и тех же аргументов.
♦ Представление должно ссылаться на одну базовую таблицу.
♦ Представление и базовая таблица (таблицы) должны иметь одного и того же владельца и принадлежать одной и той же базе данных.
♦ Представление должно быть создано с опцией schemabinding. Эта опция связывает представление со схемой, содержащей базовые таблицы, лежащие в основе представления.
♦ Определенные пользователем функции, на которые осуществляется ссылка, должны быть созданы с опцией schemabinding.
♦ Оператор select в представлении не может содержать следующие предложения, функции и опции: distinct, union, compute, top, order by, min, max, count, sum (для выражений, допускающих пустые значения), подзапросы, наследуемые таблицы или outer.
Язык Transact-SQL дает вам возможность проверять все эти требования, используя параметр isindexabie в функции objectproperty, как показано в примере 11.21. Если значением функции является 1, то все требования выполнены, и вы можете создавать кластеризованный индекс.