Klingt nach einem idealen Szenario für eine indizierte Ansicht, mit der Sie Berechnungen und Aggregate zum Zeitpunkt des Schreibens anstelle der Abfragezeit bezahlen können.
CREATE VIEW dbo.MyIndexedView
WITH SCHEMABINDING
AS
SELECT Enroll_Date, UserID, RawCount = COUNT_BIG(*)
FROM dbo.UserTable
GROUP BY Enroll_Date, UserID;
GO
CREATE UNIQUE CLUSTERED INDEX CIX_miv ON dbo.MyIndexedView(Enroll_Date, UserID);
Das Erstellen dauert einige Zeit und erfordert natürlich eine Wartung aller DML-Vorgänge, genau wie ein Index für die Basistabelle.
Jetzt wäre die Abfrage für diese Ansicht ziemlich ähnlich - jede Zeile in der Ansicht stellt jetzt eine eigene Benutzer- / Datumskombination dar, sodass diese Zahl durch einen einzelnen COUNT (*) berechnet werden kann, während die Gesamtzahl der Zeilen in der Basistabelle gleich ist bereits teilweise für Sie aggregiert, jetzt müssen Sie sie nur noch mit SUM pro Datum addieren:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
NOEXPAND-Hinweis hinzugefügt, nachdem dies und das gespeichert wurde .
Ich kann Ihnen ohne Zweifel sagen, dass diese Abfrage schneller ist als Ihre aktuelle Abfrage (aber nicht um wie viel), außer in dem seltenen Fall, dass Sie genau einen Benutzer für jedes Datum haben (in diesem Fall wird dieselbe Datenmenge vorhanden sein) zu lesen) und die uns bekannten Spalten sind die einzigen Spalten im Index der Basistabelle. Ob diese Leistungssteigerung zum Zeitpunkt des Lesens die zusätzliche Arbeit wert ist, die sich auf den Schreibanteil Ihrer Arbeitslast auswirkt, können wir Ihnen nicht sagen - Sie müssen sie testen, um den Kompromiss zu messen (kein Index ist frei).
Und wenn Sie häufig dieselben allgemeinen WHERE-Klauseln für Enroll_Date für bestimmte, genau definierte Bereiche verwenden (z. B. das aktuelle Quartal oder Jahr bis heute), können Sie übereinstimmende gefilterte Indizes hinzufügen, die diese E / A noch weiter reduzieren (aber es gibt immer eine Abtausch).
Sie können auch einen Clustered-Index für die Basistabelle erstellen. Dies scheint nicht einer der sehr seltenen Anwendungsfälle zu sein, die von einem Haufen profitieren.