SQL Server 2017'de SNAPSHOT_MATERIALISATION ile nasıl bir görünüm yaratırsınız?


36

SQL Server 2017'de birkaç yeni saklı yordam var:

  • sp_refresh_single_snapshot_view - @view_name nvarchar (261), @rgCode int için giriş param
  • sp_refresh_snapshot_views - @rgCode int için giriş param

Ve sys.messages içindeki yeni girişler:

  • 10149 - SNAPSHOT_MATERIALIZATION olan dizin görünümde oluşturulamıyor '%. * Ls' çünkü görünüm tanımı bellek için optimize edilmiş tablo (lar) içeriyor.
  • 10642 - SNAPSHOT_MATERIALIZATION dizini için ayarlanamıyor '%. * Ls' ''..
  • 10643 - SNAPSHOT_MATERIALIZATION, '%. * Ls' için '%.
  • 10648 - SNAPSHOT_MATERIALIZATION bölümlenmiş dizin için ayarlanamıyor '%. * Ls' üzerinde '%. * Ls'.
  • 10649 - Kümelenmemiş dizin '%. * Ls', '%. * Ls' üzerinde kümelenmiş dizini olan '%. * Ls' üzerinde oluşturulamıyor.
  • 10650 - Anlık görüntü görünümlerinin yenilenmesi, veritabanında etkinleştirilmiş anlık görüntü yalıtımı gerektirir.
  • 3760 - Dizin bırakılamıyor '%. * Ls' görünümünde '%. * Ls' SNAPSHOT_MATERIALIZATION.
  • 4524 - Görüntü değiştirilemiyor '%.
  • 4525 - Görünümde '% ls' ipucu kullanılamıyor '%. * Görüntü yenilenmeden önce anlık görüntüye sahip olan ls'.

Ve yeni Genişletilmiş Olaylar:

Anlık görüntü görünümü Extended Events

Öyleyse nasıl anlık görüntü oluşturulmuş bir görünüm oluşturabiliriz? (Microsoft henüz açıkça belgelenmedi.) İşte şimdiye kadar denemedim , işe yaramadı bir şeyler .

Yanıtlar:


55

Yapamazsın Bu özellik 2017 RTM'de devre dışı bırakılmıştır.


Dedi ki, sen ...

AdventureWorks'ü Kullanma:

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);

Temel tablolarda yapılan değişiklikler görünümde hemen görünmez (normalde olduğu gibi SQL Server'da olduğu gibi). Aynı şekilde, temel tablolara karşı yapılan veri değişikliklerinin anlık görüntü dizine alınmış görünümünü sürdürmesi gerekmez.

Görünüm içeriğini yenilemek için, yeni saklı yordamlardan birini aramanız gerekir:

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

Bu yürütme planı üretir:

Plan

Bu muhtemelen sizin için işe yaramayacaktır, çünkü belgelenmemiş bir izleme bayrağı gereklidir veya yaptığım çok kötü bir şeyi yapmanız gerekir: bu özelliği etkinleştirmek için özellik bayrağını tutarak (bir hata ayıklayıcı kullanarak) hafıza konumuna yazma.

Merak ediyorsanız, özellik bayrağı bayt'tır sqllang!g_featureSwitchesLangSvc+0x10f. Sırasında kontrol edilir sqllang!SpRefreshSingleSnapshotView.

Oynamak istiyorsanız ve çalışırken SQL Server'ın kodunu hacklemenin sonuçlarını kabul etmeye ve Microsoft'un henüz hazır olmadığını düşünmediğini düşündüğü bir özelliği kullanarak tamamen hazırsanız:

  1. SQL Server 2017 işlemine bir hata ayıklayıcı ekleyin. WinDbg kullanıyorum.
  2. Bir kesme noktası ayarlayın:

    bp sqllang!SpRefreshSingleSnapshotView
  3. Go komutunu kullanarak SQL Server'ı sürdürün ( g)

  4. Yukarıdaki görünümü oluştur, ancak benzersiz kümelenmiş dizini henüz oluştur
  5. sys.sp_refresh_single_snapshot_viewYukarıdaki komutu çalıştır
  6. Kesme noktasına ulaşıldığında, kod satırını görene kadar adım atın:

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

    Diğer yapılarda ofset farklı olabilir, örneğin 2017 RTM CU3 sqllang!g_featureSwitchesLangSvc+0x114

  7. Parantez içindeki hafıza adresi farklı olabilir. Gördüğünüzü kullanın.

  8. Bulunan hafıza adresindeki mevcut değeri görmek için ekran hafıza komutunu kullanın:

    db 00007fff`328dfbcf L1
  9. Bu, özelliğin devre dışı olduğunu belirten bir sıfır göstermelidir.

  10. Enter value komutunu kullanarak sıfırı bire değiştirin (yine bellek adresinizle):

    eb 00007fff`328dfbcf 1
  11. Kesme noktasını devre dışı bırakın ve SQL Server'ı çalıştırmaya devam edin.

  12. Özellik şimdi etkindir.
  13. Görünümde benzersiz kümelenmiş dizini oluşturun.
  14. Oynamak.

Not SNAPSHOT_MATERIALIZATION, normalde endekslenemeyen bir sorgu belirtiminin anlık görüntüsünü gerçekleştirmemize olanak sağlar, örneğin aşağıdakiler kullanılır 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);

Sonuç:

Komutlar başarıyla tamamlandı.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.