Wir haben ein Data Warehouse mit einer ziemlich großen Datensatzanzahl (10-20 Millionen Zeilen) und führen häufig Abfragen aus, die Datensätze zwischen bestimmten Datumsangaben oder Datensätze mit bestimmten Flags zählen, z
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
Die Leistung ist nicht schlecht, kann aber relativ träge sein (vielleicht 10 Sekunden bei kaltem Cache).
Kürzlich entdeckte ich, dass ich GROUP BY
in indizierten Ansichten verwenden kann, und probierte etwas Ähnliches wie das Folgende aus
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
);
Infolgedessen ist die Leistung meiner ersten Abfrage jetzt <100 ms und die resultierende Ansicht und der resultierende Index <100 KB (obwohl unsere Zeilenzahl groß ist, bedeutet der Bereich von Datums- und Flag-IDs, dass diese Ansicht nur 1000 bis 2000 Zeilen enthält).
Ich dachte, dass dies vielleicht die Leistung von Schreibvorgängen in die Widget-Tabelle verdreifachen würde, aber nein - die Leistung von Einfügungen und Aktualisierungen in diese Tabelle ist meines Erachtens ziemlich unbeeinträchtigt (und da es sich um ein Data Warehouse handelt, wird diese Tabelle nur selten aktualisiert sowieso)
Für mich ist das viel zu schön, um wahr zu sein - oder? Was muss ich beachten, wenn ich indizierte Ansichten auf diese Weise verwende?
SELECT
undCREATE VIEW
Skripte sind falsch, wie ich glaube, ist IhrCREATE INDEX
Skript.