Как создать материализованные представления в SQL Server?

101

Я собираюсь разработать DW и слышал о материализованных представлениях. На самом деле я хочу создать представление, и оно должно автоматически обновляться при изменении базовых таблиц. Может ли кто-нибудь объяснить на примере запроса ..

Дипак
источник

Ответы:

144

В SQL Server они называются индексированными представлениями - прочтите эти официальные документы, чтобы узнать больше:

По сути, все, что вам нужно сделать, это:

  • создать обычный вид
  • создать кластерный индекс для этого представления

и вы сделали!

Сложность заключается в том, что представление должно удовлетворять целому ряду ограничений и ограничений - они изложены в официальном документе. Если так сделаешь - все, что есть. Представление обновляется автоматически, обслуживание не требуется.

Дополнительные ресурсы:

marc_s
источник
Спасибо за ваш ответ. Я получил то, что хочу ... Я тоже хотел бы узнать об индексах. Я хочу знать, есть ли способ создать диаграмму звездообразной схемы на SQL-сервере, когда у меня готова вся структура таблицы? Если да, как мне создать для этого таблицу фактов?
Дипак,
4
Ограничения на размещение кластерного индекса в представлении обширны. Например, представление не может ссылаться на другие представления и не может содержать внешние соединения. Таким образом, многие представления, требующие большей производительности, не могут использовать этот метод. Тем не менее хороший ответ.
Джефф Уилсон
2
Как упоминалось в соответствующем вопросе, статья блога MSDN, blogs.msdn.microsoft.com/ssma/2011/06/20/… , освещает некоторые ключевые различия между материализованными представлениями и индексированными представлениями. Самым проблемным IMHO является невозможность указать триггеры обновления: индексированные представления обновляются всякий раз, когда обновляются базовые таблицы, что подрывает большинство преимуществ производительности использования материализованного представления. Запреты на объединения, агрегаты, оконные функции и подзапросы делают индексированные представления почти бессмысленными, если данные не меняются часто.
Suncat2000 02
43

Хотя чисто с инженерной точки зрения, индексированные представления кажутся чем-то вроде того, что может использовать каждый для повышения производительности, но реальный сценарий сильно отличается. Мне не удалось использовать индексированные представления там, где они мне больше всего нужны, из-за слишком многих ограничений на то, что можно индексировать, а что нет.

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

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

Я буду рад услышать несколько реальных жизненных сценариев, в которых люди действительно использовали индексированные просмотры в своих интересах и не смогли бы обойтись без них.

Раджив
источник
На самом деле я использовал индексированные представления (только один раз) для разделения индекса полнотекстового поиска. Индексы FTS действительно не могут быть разделены, но отдельные индексы могут быть созданы для нескольких представлений из одной и той же таблицы. Однако это была крайняя мера.
areyesram
4
Вам нужно не забыть добавить (NOEXPAND)подсказку к запросам, которые используют индексированные представления. И тогда вы замечаете разницу. Преимущество использования индексированных представлений по сравнению с «правильной индексацией таблиц» заключается в ограничении выбора записей, иначе вы правы, это будет то же самое.
ajeh
Да, вещь NOEXPAND нельзя недооценивать!
Simon_Weaver
18

Возможно, вам понадобится немного больше информации о том, что на самом деле представляет собой материализованное представление. В Oracle это объект, который состоит из ряда элементов, когда вы пытаетесь построить его где-то еще.

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

В SQL Server я бы использовал следующее, чтобы создать базовый MVIEW для регулярного (полного) обновления.

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

Все остальное - эксперименты.

Джейсон А.
источник
5
Ваши комментарии о SQL Server неверны - материализованные представления - это очень разные вещи в Oracle и SQL Server. В SQL Server представление с уникальным кластеризованным индексом на нем (также известное как «материализованное представление») не обновляется и не может быть обновлено пользователем, а также не сохраняется в отдельной созданной пользователем таблице - оно всегда обновляется движок во время обновлений и никогда не рассинхронизируется. Сохранение снимка данных не требуется.
ErikE
10
То, что запрашивал OP, легко можно получить с помощью индексированного представления. Это самая близкая вещь, которую SQL Server изначально предоставляет для материализованного представления Oracle. Однако, если вы хотите / хотите точно воспроизвести работу Oracle MVIEW, Джейсон прав. Подход Джейсона также помогает в том же сценарии, что и Oracle MVIEW - например, обновление таблицы отчетов в нерабочее время, когда вы больше заботитесь о загрузке базы данных, чем о том, насколько актуально представление (например, отчеты только по вчерашним числам ...)
4

Когда индексированное представление недоступно и быстрые обновления не требуются, вы можете создать таблицу кеширования взлома:

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

затем sp_rename view / table или измените любые запросы или другие представления, которые ссылаются на него, чтобы они указывали на таблицу кеша.

расписание ежедневно / ночью / еженедельно / еще много чего обновлять

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

NB: это будет занимать место, также в ваших журналах tx. Лучше всего использовать для небольших наборов данных, которые медленно вычисляются. Может быть, провести рефакторинг, чтобы сначала исключить "простые, но большие" столбцы во внешний вид.

сток
источник
1

Для MS T-SQL Server я предлагаю изучить создание индекса с помощью оператора include. Не требуется ни уникальности, ни физической сортировки данных, связанных с кластеризованным индексом. «Индекс ... Include ()» создает отдельное физическое хранилище данных, автоматически поддерживаемое системой. Концептуально это очень похоже на материализованное представление Oracle.

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx

Скотт Найтлингер
источник