Temos um armazém de dados 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 é péssimo, mas pode ser relativamente lento (talvez 10 segundos em um cache frio).
Recentemente, descobri que posso usar GROUP BY
em visualizações indexadas e, portanto, 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 os IDs de sinalizadores significa que essa exibição contém apenas de 1000 a 2000 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 não é afetado tanto quanto eu poderia dizer (além disso, por ser um data warehouse, essa tabela é atualizada com pouca frequência de qualquer forma)
Para mim, isso parece bom demais para ser verdade - não é? Com o que preciso ter cuidado ao usar modos de exibição indexados dessa maneira?
SELECT
eCREATE VIEW
scripts estão errados, como acredito que seja seuCREATE INDEX
script.