Як створити подання за допомогою SNAPSHOT_MATERIALIZATION у SQL Server 2017?


36

У SQL Server 2017 є кілька нових збережених процедур:

  • sp_refresh_single_snapshot_view - парам вводу для @view_name nvarchar (261), @rgCode int
  • sp_refresh_snapshot_views - параметр введення для @rgCode int

І нові записи в sys.messages:

  • 10149 - Індекс, у якому є SNAPSHOT_MATERIALIZATION, неможливо створити для перегляду '%. * Ls', оскільки визначення представлення містить оптимізовані для пам'яті таблиці (и).
  • 10642 - SNAPSHOT_MATERIALIZATION не можна встановити для індексу '%. * Ls' на '%. * Ls', тому що він застосовний лише до індексів представлень.
  • 10643 - SNAPSHOT_MATERIALIZATION не можна встановити для '%. * Ls' на '%. * Ls', оскільки це застосовно лише до кластерних індексів у представленнях.
  • 10648 - SNAPSHOT_MATERIALIZATION не можна встановити для розділеного індексу '%. * Ls' на '%. * Ls'.
  • 10649 - Некластеризований індекс '%. * Ls' неможливо створити на '%. * Ls', який кластеризує індекс '%. * Ls' за допомогою SNAPSHOT_MATERIALIZATION.
  • 10650 - для оновлення режиму перегляду знімків потрібно включити ізоляцію знімків у базі даних.
  • 3760 - Неможливо скинути індекс '%. * Ls' на перегляд '%. * Ls', який має SNAPSHOT_MATERIALIZATION.
  • 4524 - Неможливо змінити вигляд "%. * Ls", оскільки це матеріалізація знімків.
  • 4525 - Неможливо використати підказку '% ls' для перегляду '%. * Ls', яка має матеріалізацію знімків до оновлення подання.

І нові розширені події:

Перегляд знімків Розширені події

Тож як ми можемо створити перегляд, що матеріалізується на знімку? (Очевидно, Microsoft це ще не задокументував.) Ось суть речей, які я намагався до цього часу , які не спрацювали.

Відповіді:


55

Ви не можете. Ця функція вимкнена в 2017 році.


Це сказав, що ви можете ...

Використання AdventureWorks:

CREATE VIEW dbo.TH
WITH SCHEMABINDING
AS
SELECT P.ProductID, COUNT_BIG(*) AS cbs
FROM Production.Product AS P
JOIN Production.TransactionHistory AS TH
    ON TH.ProductID = P.ProductID
GROUP BY P.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

Зміни в базових таблицях не одразу відображаються у вікні перегляду (як це зазвичай відбувається у SQL Server). Аналогічно, модифікації даних для базових таблиць не повинні підтримувати поданий в індексах моментний знімок.

Щоб оновити вміст перегляду, потрібно викликати одну з нових збережених процедур:

EXECUTE sys.sp_refresh_single_snapshot_view
    @view_name = N'dbo.TH',
    @rgCode = 0; -- don't know what this is for yet

Це створює план виконання:

План

Це, ймовірно, не підійде для вас, оскільки потрібен або незадокументований прапор сліду, або вам потрібно зробити особливо неприємне, що я зробив: записати в пам'ять, де міститься прапор функції (за допомогою відладчика), щоб увімкнути цю функцію.

Якщо вам цікаво, прапором функції є байт у sqllang!g_featureSwitchesLangSvc+0x10f. Це перевіряється протягом sqllang!SpRefreshSingleSnapshotView.

Якщо ви хочете пограти, і ви готові прийняти наслідки злому коду SQL Server під час його роботи, а також використовувати функцію, для якої Microsoft, на думку, ще не готова:

  1. Додайте відладчик до процесу SQL Server 2017. Я використовую WinDbg.
  2. Встановіть точку перерви:

    bp sqllang!SpRefreshSingleSnapshotView
  3. Відновити SQL Server за допомогою команди Go ( g)

  4. Створіть подання вище, але ще не єдиний кластерний індекс
  5. Виконайте sys.sp_refresh_single_snapshot_viewкоманду вище
  6. Коли буде досягнута точка перерви, переходьте, поки не побачите рядок коду:

    cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0

    Зсув може бути різним в інших збірках, наприклад у 2017 році RTM CU3 sqllang!g_featureSwitchesLangSvc+0x114

  7. Адреса пам'яті всередині дужок може бути різною. Використовуйте той, який бачите.

  8. Використовуйте команду відображення пам'яті, щоб переглянути поточне значення за знайденою вами адресою пам'яті:

    db 00007fff`328dfbcf L1
  9. Це повинно показувати нуль, вказуючи на те, що функція вимкнена.

  10. Змініть нуль на одиницю, скориставшись командою введення значень (знову з адресою пам'яті):

    eb 00007fff`328dfbcf 1
  11. Вимкніть точку перерви та відновіть роботу SQL Server.

  12. Ця функція тепер увімкнена.
  13. Побудуйте унікальний кластерний індекс на поданні.
  14. Пограйте.

Примітка SNAPSHOT_MATERIALIZATIONдозволяє нам оформити знімок специфікації запиту, який зазвичай не можна індексувати, наприклад, наведені нижче дії MAX:

CREATE VIEW dbo.TH2
WITH SCHEMABINDING
AS
SELECT TH.ProductID, MaxTransactionID = MAX(TH.TransactionID)
FROM Production.TransactionHistory AS TH
GROUP BY TH.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH2 (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

Результат:

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