Brzmi jak idealny scenariusz dla widoku indeksowanego, który pozwala płacić za obliczenia i agregacje w czasie zapisu zamiast w czasie zapytania.
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);
To zajmie trochę czasu, i oczywiście będzie wymagało konserwacji podczas wszystkich operacji DML, podobnie jak indeks w tabeli podstawowej.
Teraz zapytanie dotyczące tego widoku byłoby dość podobne - każdy wiersz w widoku reprezentuje teraz odrębną kombinację użytkownik / data, dzięki czemu liczbę można obliczyć za pomocą pojedynczej LICZBY (*), podczas gdy całkowita liczba wierszy w tabeli podstawowej wynosi już częściowo dla Ciebie zagregowane, teraz wystarczy je dodać za pomocą SUMA na datę:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
Dodano wskazówkę NOEXPAND, po zapamiętaniu tego i tego .
Mogę powiedzieć bez wątpienia, że to zapytanie będzie szybsze niż twoje obecne zapytanie (ale nie o ile), z wyjątkiem rzadkiego przypadku, w którym masz dokładnie jednego użytkownika na każdą datę (w którym to przypadku ta sama ilość danych będzie miała do przeczytania), a kolumny, o których wiemy, są jedynymi kolumnami w indeksie tabeli podstawowej. Nie możemy powiedzieć, czy zwiększenie wydajności w czasie odczytu jest warte dodatkowej pracy, która wpłynie na zapisywanie twojego obciążenia - musisz to przetestować, aby zmierzyć kompromis (żaden indeks nie jest darmowy).
A jeśli często używasz tych samych wspólnych klauzul WHERE przeciwko Enroll_Date dla określonych, dobrze zdefiniowanych zakresów (powiedzmy, bieżący kwartał lub rok do tej pory), możesz dodać pasujące przefiltrowane indeksy, które jeszcze bardziej zmniejszają to we / wy (ale zawsze istnieje kompromis).
Możesz także rozważyć umieszczenie indeksu klastrowego w tabeli podstawowej. To nie wydaje się być jednym z tych bardzo rzadkich przypadków użycia, które korzystają ze sterty.