Как создать материализованные представления в SQL Server? - PullRequest
82 голосов
/ 21 октября 2010

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

Ответы [ 5 ]

122 голосов
/ 21 октября 2010

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

В общем, все, что вам нужно сделать, это:

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

и все готово!

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

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

36 голосов
/ 16 июня 2013

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

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

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

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

16 голосов
/ 24 апреля 2014

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

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

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

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

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

2 голосов
/ 22 мая 2016

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

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

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

1 голос
/ 23 июня 2016

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

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

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

...