Tenemos un almacén de datos con un recuento de registros bastante grande (10-20 millones de filas) y, a menudo, ejecutamos consultas que cuentan registros entre ciertas fechas o cuentan registros con ciertas banderas, por ejemplo
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
El rendimiento no es horrible, pero puede ser relativamente lento (quizás 10 segundos en un caché frío).
Recientemente descubrí que puedo usar GROUP BY
en vistas indexadas y probé algo similar a lo siguiente
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, el rendimiento de mi primera consulta ahora es <100ms, y la vista e índice resultante es <100k (aunque nuestro recuento de filas es grande, el rango de fechas e ID de marcas significa que esta vista solo contiene 1000-2000 filas).
Pensé que tal vez esto podría afectar el rendimiento de las escrituras en la tabla Widget, pero no, el rendimiento de las inserciones y actualizaciones en esta tabla no se ve afectado por lo que pude ver (además, al ser un almacén de datos, esta tabla se actualiza con poca frecuencia de todas formas)
Para mí, esto parece demasiado bueno para ser verdad, ¿verdad? ¿Con qué debo tener cuidado al usar vistas indexadas de esta manera?
SELECT
yCREATE VIEW
están equivocados, ya que creo que es tuCREATE INDEX
guión.