Здається, ідеальний сценарій для індексованого перегляду, який дозволяє платити за розрахунки та агрегати в час запису замість часу запиту.
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);
Для створення цього знадобиться деякий час, і, звичайно, знадобиться обслуговування протягом усіх операцій DML, як і індекс базової таблиці.
Тепер запит проти цього представлення був би досить схожим - кожен рядок у представленні тепер представляє собою окреме комбінацію користувача / дати, тому ця цифра може бути обчислена одним COUNT (*), тоді як загальна кількість рядків у базовій таблиці становить вже частково зведені для вас, тепер вам просто потрібно буде додати їх за допомогою SUM на дату:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
Додано підказку NOEXPAND, згадавши це та це .
Я можу вам сказати без сумніву, що цей запит буде швидшим, ніж ваш поточний запит (але не на скільки), за винятком рідкісного випадку, коли у вас є рівно один користувач на кожну дату (у такому випадку однаковий обсяг даних матиме для читання) і стовпці, про які ми знаємо, - це єдині стовпці в індексі базової таблиці. Чи варто це підвищення продуктивності в час читання додаткової роботи, яка вплине на частину вашої завантаженості запису - це те, що ми не можемо сказати вам - вам доведеться протестувати це для вимірювання компромісу (жоден індекс не є безкоштовним).
І якщо ви часто використовуєте одні й ті ж загальні пропозиції WHERE щодо Enroll_Date для конкретних, чітко визначених діапазонів (скажімо, поточного кварталу чи року на сьогоднішній день), ви можете додати відповідні відфільтровані індекси, які ще більше зменшують цей ввід / вивід (але завжди є компроміс).
Ви також можете розглянути можливість кластеризованого індексу на базову таблицю. Це, здається, не є одним з тих дуже рідкісних випадків використання, які отримують користь від купи.