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

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

Ответ 1

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

В принципе, все, что вам нужно сделать, это:

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

и все готово!

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

В SQL Server я бы использовал следующее, чтобы регулярно создавать базовые обновления 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 или изменить любые запросы или другие представления, ссылающиеся на нее, чтобы указать на таблицу кэша.

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

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

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

Ответ 5

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

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

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