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?
SELECT
veCREATE VIEW
senaryolar yanlışCREATE INDEX
.