Как создать материализованные представления в SQL Server?
Я собираюсь разработать DW, и я слышал о материализованных взглядах. На самом деле я хочу создать представление, и оно должно обновляться автоматически при изменении базовых таблиц. Может кто-нибудь объяснить с примером запроса..
5 ответов
Они называются индексированными представлениями в SQL Server - прочтите эти технические документы для получения дополнительной информации:
- Создание индексированного представления
- Повышение производительности с помощью индексированных представлений SQL Server 2008
В общем, все, что вам нужно сделать, это:
- создать регулярный вид
- создать кластерный индекс в этом представлении
и вы сделали!
Сложность заключается в следующем: представление должно удовлетворять целому ряду ограничений и ограничений - они изложены в официальном документе. Если вы сделаете это - это все, что есть. Представление обновляется автоматически, обслуживание не требуется.
Дополнительные ресурсы:
Хотя чисто с технической точки зрения индексированные представления звучат как то, что каждый может использовать для повышения производительности, но сценарий реальной жизни сильно отличается. Я потерпел неудачу, используя индексированные представления, где они мне больше всего нужны из-за слишком большого количества ограничений на то, что может быть проиндексировано, а что нет.
Если у вас есть внешние объединения в представлениях, они не могут быть использованы. Кроме того, общие табличные выражения недопустимы... На самом деле, если у вас есть какой-либо порядок в подвыборах или производных таблицах (например, с разделением по выражению), вам тоже не повезло.
Это оставляет только очень простые сценарии использования индексированных представлений, что-то, на мой взгляд, может быть оптимизировано путем создания надлежащих индексов для базовых таблиц в любом случае.
Я буду рад услышать некоторые реальные сценарии, когда люди фактически использовали индексированные представления в свою пользу и не могли обойтись без них
Возможно, вам понадобится немного больше информации о том, что такое Материализованное представление. В Oracle это объект, который состоит из ряда элементов, когда вы пытаетесь построить его в другом месте.
MVIEW - это, по сути, снимок данных из другого источника. В отличие от представления, данные не найдены, когда вы запрашиваете представление, они хранятся локально в форме таблицы. MVIEW обновляется с использованием фоновой процедуры, которая запускается через равные промежутки времени или при изменении исходных данных. Oracle допускает полное или частичное обновление.
В SQL Server я использовал бы следующее, чтобы создать базовый MVIEW для (полного) обновления регулярно.
Во-первых, вид. Это должно быть легко для большинства, так как представления довольно распространены в любой базе данных. Далее, в таблице. Это должно быть идентично представлению в столбцах и данных. Это будет хранить снимок данных представления. Затем процедура, которая усекает таблицу и перезагружает ее на основе текущих данных в представлении. Наконец, задание, которое запускает процедуру, чтобы начать ее работу.
Все остальное - эксперименты.
Если индексированное представление недоступно и быстрые обновления не нужны, вы можете создать таблицу кеша взлома:
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: это займет место, также в ваших журналах передачи. Лучше всего использовать для небольших наборов данных, которые медленно вычисляются. Может быть, рефакторинг для устранения "простых, но больших" столбцов сначала во внешнем виде.
Для MS T-SQL Server я предлагаю изучить создание индекса с помощью оператора "include". Уникальность не требуется, равно как и физическая сортировка данных, связанных с кластеризованным индексом. "Index ... Include ()" создает отдельное физическое хранилище данных, автоматически поддерживаемое системой. Концептуально это очень похоже на материализованное представление Oracle.