Sorgu zamanı yerine yazma zamanında hesaplamalar ve toplamalar için ödeme yapmanıza olanak tanıyan dizine alınmış bir görünüm için ideal bir senaryo gibi görünür.
CREATE VIEW dbo.MyIndexedView
WITH SCHEMABINDING
AS
SELECT Enroll_Date, UserID, RawCount = COUNT_BIG(*)
FROM dbo.UserTable
GROUP BY Enroll_Date, UserID;
GO
CREATE UNIQUE CLUSTERED INDEX CIX_miv ON dbo.MyIndexedView(Enroll_Date, UserID);
Bunun oluşturulması biraz zaman alacak ve elbette, temel tablodaki bir dizin gibi, tüm DML işlemlerinde bakım gerektirecektir.
Şimdi bu görünüme karşı sorgu oldukça benzer olacaktır - görünümdeki her satır şimdi ayrı bir kullanıcı / tarih kombinasyonunu temsil eder, böylece bu sayı tek bir COUNT (*) ile hesaplanabilirken, temel tablodaki toplam satır sayısı zaten sizin için kısmen toplanmıştır, şimdi bunları tarih başına SUM kullanarak eklemeniz yeterlidir:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
Bunu ve bunu hatırladıktan sonra NOEXPAND ipucu eklendi .
Hiç şüphesiz bu sorgunun her bir sorgu için tam olarak bir kullanıcınızın olduğu nadir durumlarda (bu durumda aynı miktarda veri olacaktır) okunacak) ve bildiğimiz sütunlar temel tablonun dizinindeki tek sütunlardır. Okuma zamanındaki performans artışının, iş yükünüzün yazma kısmını etkileyecek ekstra çalışmaya değip değmeyeceği, size söyleyemeyeceğimiz bir şeydir - ödünleşimi ölçmek için test etmeniz gerekir (hiçbir dizin ücretsiz değildir).
Ayrıca, belirli, iyi tanımlanmış aralıklar (örneğin, geçerli çeyrek veya bugüne kadar) için Enroll_Date'e karşı aynı ortak WHERE yan tümcelerini sık sık kullanıyorsanız, G / Ç'yi daha da azaltan eşleşen filtrelenmiş dizinler ekleyebilirsiniz (ancak her zaman Pazarlıksız).
Ayrıca temel tabloya kümelenmiş bir dizin koymayı düşünebilirsiniz. Bu, bir yığından yararlanan çok nadir kullanım durumlarından biri gibi görünmüyor.