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:
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:
- SQL Server 2017 işlemine bir hata ayıklayıcı ekleyin. WinDbg kullanıyorum.
Bir kesme noktası ayarlayın:
bp sqllang!SpRefreshSingleSnapshotView
Go komutunu kullanarak SQL Server'ı sürdürün ( g
)
- Yukarıdaki görünümü oluştur, ancak benzersiz kümelenmiş dizini henüz oluştur
sys.sp_refresh_single_snapshot_view
Yukarıdaki komutu çalıştır
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
Parantez içindeki hafıza adresi farklı olabilir. Gördüğünüzü kullanın.
Bulunan hafıza adresindeki mevcut değeri görmek için ekran hafıza komutunu kullanın:
db 00007fff`328dfbcf L1
Bu, özelliğin devre dışı olduğunu belirten bir sıfır göstermelidir.
Enter value komutunu kullanarak sıfırı bire değiştirin (yine bellek adresinizle):
eb 00007fff`328dfbcf 1
Kesme noktasını devre dışı bırakın ve SQL Server'ı çalıştırmaya devam edin.
- Özellik şimdi etkindir.
- Görünümde benzersiz kümelenmiş dizini oluşturun.
- 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ı.