Oldukça büyük bir kayıt sayısına (10-20 milyon satır) sahip bir veri ambarımız var ve genellikle belirli tarihler arasındaki kayıtları sayan veya belirli bayraklara sahip kayıtları sayan sorguları çalıştırıyoruz.
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
Performans korkunç değil, ama nispeten yavaş olabilir (soğuk bir önbellekte 10 saniye).
Son zamanlarda GROUP BY, indekslenmiş görünümlerde kullanabileceğimi keşfettim ve bu yüzden aşağıdakine benzer bir şey denedim
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
Sonuç olarak, ilk sorgunun performansı şimdi <100ms ve sonuçta ortaya çıkan görünüm & dizin <100k (satır sayımız büyük olmasına rağmen, tarih ve bayrak kimlikleri aralığı bu görünümün yalnızca 1000-2000 satır içerdiği anlamına gelir).
Belki de bunun Widget tablosuna yazma işleminin performansını azaltacağını düşündüm, ama hayır - bu tablodaki eklerin ve güncellemelerin performansı söyleyebileceğim kadar etkilenmedi (artı, bu tablonun nadiren güncellenmesi Neyse)
Bana göre bu gerçek olamayacak kadar iyi görünüyor - öyle mi? Dizinli görünümleri bu şekilde kullanırken neye dikkat etmeliyim?
SELECTveCREATE VIEWsenaryolar yanlışCREATE INDEX.