Temos um data warehouse com uma contagem de registros bastante grande (10 a 20 milhões de linhas) e geralmente executamos consultas que contam registros entre determinadas datas ou contam registros com determinados sinalizadores, por exemplo
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
O desempenho não é terrível, mas pode ser relativamente lento (talvez 10 segundos em um cache frio).
Recentemente, descobri que posso usar GROUP BY
em exibições indexadas e tentei algo semelhante ao seguinte
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
);
Como resultado, o desempenho da minha primeira consulta agora é < 100ms e a exibição e o índice resultantes são < 100k (embora nossa contagem de linhas seja grande, o intervalo de datas e IDs de sinalizador significa que essa exibição contém apenas 1.000 a 2.000 linhas).
Eu pensei que talvez isso prejudicasse o desempenho das gravações na tabela Widget, mas não - o desempenho das inserções e atualizações nesta tabela é praticamente inalterado, tanto quanto eu posso dizer (além disso, sendo um data warehouse, esta tabela é atualizada com pouca frequência de qualquer forma)
Para mim, isso parece bom demais para ser verdade - é? Com o que preciso ter cuidado ao usar exibições indexadas dessa maneira?