Як створити матеріалізовані подання в SQL Server?


101

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

Відповіді:


144

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

В основному, все, що вам потрібно зробити, це:

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

і ви закінчили!

Хитра частина полягає в тому, що погляд повинен задовольняти безліч обмежень та обмежень - тих, що викладені в доповіді. Якщо ви зробите це - це все, що є. Представлення даних оновлюється автоматично, обслуговування не потрібне.

Додаткові ресурси:


Спасибі за Вашу відповідь. Я отримав те, що хочу .. Я також хотів би знати про індекси. Я хочу знати, чи є спосіб сформувати схему зіркової схеми на SQL-сервері, коли у мене готова вся структура таблиці? Якщо так, як мені створити таблицю фактів для цього?
— Діпак,

3
Обмеження щодо розміщення кластерного індексу для перегляду є великими. Наприклад, представлення не може посилатися на інші погляди і не може містити зовнішніх з'єднань. Отже, багато видів, які потребують кращої продуктивності, не можуть використовувати цей метод. Все-таки хороша відповідь.
— Джефф Вілсон

1
Як згадується у відповідному питанні, стаття в блозі MSDN, blogs.msdn.microsoft.com/ssma/2011/06/20/… , висвітлює деякі ключові відмінності між матеріалізованими поглядами та індексованими поглядами. Найбільш проблемним IMHO є неможливо вказати тригери оновлення: індексовані представлення оновлюються щоразу, коли базові таблиці оновлюються - підриваючи більшість переваг продуктивності використання матеріалізованого представлення даних. Заборони на об'єднання, агрегати, функції вікна та підзапити роблять індексовані подання майже безглуздими, якщо дані не змінюються часто.
— Suncat2000,

43

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

Якщо у представленнях є зовнішні з'єднання, їх не можна використовувати. Крім того, загальні вирази таблиці не дозволені ... Насправді, якщо у вас є впорядкування в підселектах або похідних таблицях (наприклад, з розділом за пунктом), вам теж не пощастить.

Це залишає лише дуже прості сценарії для використання індексованих поглядів, щось, на мій погляд, можна оптимізувати, створивши належні індекси в таблицях, що лежать в основі.

Мені буде приємно почути деякі сценарії реального життя, коли люди фактично використовували індексовані погляди на свою користь і не могли обійтися без них


Насправді я використовував індексовані подання (лише один раз) для розділення індексу повнотекстового пошуку. Індекси FTS дійсно не можна розділити, але окремі індекси можна створити на декількох поданнях з однієї таблиці. Це було якось в крайньому випадку.
— areyesram

4
Потрібно пам’ятати, щоб додати (NOEXPAND)підказку до запитів, які використовують індексовані подання. І тоді ви помічаєте різницю. Перевага використання індексованих подань проти "правильної індексації таблиць" полягає в обмеженні вибору записів, інакше ви маєте рацію, це було б так само.
— ajeh

Так, річ NOEXPAND не можна занизити!
— Simon_Weaver

18

Можливо, вам знадобиться трохи більше інформації про те, що насправді є матеріалізованим видом. В Oracle це об’єкт, який складається з ряду елементів при спробі побудувати його в іншому місці.

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

У SQL Server я б використав наступне, щоб створити базовий MVIEW для регулярного (повного) оновлення.

По-перше, вид. Це повинно бути легко для більшості, оскільки подання досить часто зустрічаються в будь-якій базі даних далі, у таблиці. Це має бути ідентично поданню у стовпцях та даних. Це збереже знімок даних перегляду. Потім процедура, яка скорочує таблицю та перезавантажує її на основі поточних даних у поданні. Нарешті, робота, яка запускає процедуру, щоб розпочати свою роботу.

Все інше - експерименти.


5
Ваші коментарі щодо SQL Server є неправильними - матеріалізовані подання дуже різні речі в Oracle та SQL Server. У SQL Server подання з унікальним кластерним індексом (він же "матеріалізований вигляд") не може і не може бути оновлене користувачем, а також воно не зберігається в окремій створеній користувачем таблиці - воно завжди оновлюється двигун під час оновлень і ніколи не синхронізується. Не повинно бути жодного завдання для зберігання знімка даних.
— ErikE

10
Те, що просив ОП, легко наводиться за допомогою індексованого подання. Це найближче, що 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 я пропоную розглянути можливість створення індексу з оператором "включити". Унікальність не потрібна, як і фізичне сортування даних, пов’язане з кластерним індексом. Функція "Індекс ... Включити ()" створює окреме фізичне сховище даних, яке автоматично підтримується системою. Він концептуально дуже схожий на Матеріалізований погляд Oracle.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.