Kedengarannya seperti skenario ideal untuk tampilan yang diindeks, yang memungkinkan Anda membayar untuk perhitungan dan agregat pada waktu penulisan, bukan waktu permintaan.
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);
Itu akan membutuhkan waktu untuk dibuat, dan tentu saja akan membutuhkan pemeliharaan di seluruh operasi DML, seperti halnya indeks pada tabel dasar.
Sekarang kueri terhadap tampilan ini akan sangat mirip - setiap baris dalam tampilan sekarang mewakili kombo pengguna / tanggal yang berbeda, sehingga angka tersebut dapat dihitung dengan satu COUNT (*), sedangkan jumlah total baris dalam tabel dasar adalah sudah sebagian dikumpulkan untuk Anda, sekarang Anda hanya perlu menambahkannya menggunakan SUM per tanggal:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
Menambahkan petunjuk NOEXPAND, setelah mengingat ini dan ini .
Saya dapat memberi tahu Anda tanpa keraguan bahwa kueri ini akan lebih cepat daripada kueri Anda saat ini (tetapi tidak seberapa banyak), kecuali dalam kasus langka di mana Anda memiliki tepat satu pengguna untuk setiap tanggal (dalam hal ini jumlah data yang sama akan memiliki untuk dibaca) dan kolom yang kita ketahui adalah satu-satunya kolom dalam indeks tabel dasar. Apakah peningkatan kinerja pada waktu baca sepadan dengan kerja ekstra yang akan memengaruhi porsi penulisan dari beban kerja Anda adalah sesuatu yang tidak dapat kami beritahukan kepada Anda - Anda harus mengujinya untuk mengukur trade-off (tidak ada indeks gratis).
Dan jika Anda sering menggunakan klausa WHERE umum yang sama terhadap Enroll_Date untuk rentang yang spesifik dan terdefinisi dengan baik (katakanlah, kuartal saat ini atau tahun ini), Anda bisa menambahkan indeks yang cocok yang disaring yang mengurangi I / O lebih jauh (tapi selalu ada trade-off).
Anda mungkin juga mempertimbangkan untuk meletakkan indeks berkerumun di tabel dasar. Ini sepertinya bukan salah satu dari kasus penggunaan yang sangat jarang yang diuntungkan oleh tumpukan.