Disponiamo di un data warehouse con un numero di record abbastanza grande (10-20 milioni di righe) e spesso eseguiamo query che contano i record tra determinate date o contano i record con determinati flag, ad es.
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
Le prestazioni non sono orribili, ma possono essere relativamente lente (forse 10 secondi in una cache fredda).
Recentemente ho scoperto che posso usare GROUP BY
nelle viste indicizzate e quindi ho provato qualcosa di simile al seguente
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
);
Di conseguenza, le prestazioni della mia prima query sono ora <100 ms e la vista e l'indice risultanti sono <100 k (sebbene il nostro conteggio delle righe sia ampio, l'intervallo di date e ID flag indica che questa vista contiene solo 1000-2000 righe).
Ho pensato che forse questo avrebbe compromesso le prestazioni delle scritture nella tabella Widget, ma no - le prestazioni di inserimenti e aggiornamenti in questa tabella sono praticamente intatte per quanto potrei dire (in più, essendo un data warehouse questa tabella viene aggiornata di rado Comunque)
A me sembra troppo bello per essere vero - vero? Cosa devo fare attenzione quando uso le viste indicizzate in questo modo?
SELECT
e gliCREATE VIEW
script sono sbagliati, come credo sia il tuoCREATE INDEX
script.