Sembra uno scenario ideale per una vista indicizzata, che consente di pagare per calcoli e aggregati al momento della scrittura anziché al momento della query.
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);
Ci vorrà del tempo per la creazione e, naturalmente, richiederà la manutenzione in tutte le operazioni DML, proprio come un indice sulla tabella di base.
Ora la query su questa vista sarebbe abbastanza simile: ogni riga nella vista ora rappresenta un combo utente / data distinto, quindi quella cifra può essere calcolata da un singolo COUNT (*), mentre il numero totale di righe nella tabella di base è già parzialmente aggregato per te, ora devi solo aggiungerli usando SUM per data:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
Aggiunto suggerimento NOEXPAND, dopo aver ricordato questo e questo .
Posso dirti senza dubbio che questa query sarà più veloce della tua query corrente (ma non di quanto), tranne nel raro caso in cui hai esattamente un utente per ogni data (nel qual caso la stessa quantità di dati avrà da leggere) e le colonne che conosciamo sono le uniche colonne nell'indice della tabella di base. Se quel miglioramento delle prestazioni in fase di lettura valga il lavoro extra che influirà sulla porzione di scrittura del tuo carico di lavoro è qualcosa che non possiamo dirti: dovrai testarlo per misurare il compromesso (nessun indice è gratuito).
E se usi frequentemente le stesse clausole WHERE comuni contro Enroll_Date per intervalli specifici e ben definiti (ad esempio, il trimestre o l'anno corrente fino ad oggi), potresti aggiungere indici filtrati corrispondenti che riducono ulteriormente l'I / O (ma c'è sempre un scambio).
Potresti anche considerare di inserire un indice cluster nella tabella di base. Questo non sembra essere uno di quei casi d'uso molto rari che beneficiano di un mucchio.