Як створити матеріалізовані подання в 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.