Âm thanh giống như một kịch bản lý tưởng cho chế độ xem được lập chỉ mục, cho phép bạn trả tiền cho các tính toán và tổng hợp tại thời điểm viết thay vì thời gian truy vấn.
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);
Điều đó sẽ mất một chút thời gian để tạo và tất nhiên sẽ yêu cầu bảo trì trong tất cả các hoạt động DML, giống như một chỉ mục trên bảng cơ sở.
Bây giờ truy vấn đối với chế độ xem này sẽ khá giống nhau - mỗi hàng trong chế độ xem hiện đại diện cho một kết hợp người dùng / ngày riêng biệt, do đó, con số đó có thể được tính bằng một COUNT (*), trong khi tổng số hàng trong bảng cơ sở là đã được tổng hợp một phần cho bạn, bây giờ bạn chỉ cần thêm chúng bằng SUM mỗi ngày:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
Đã thêm gợi ý NOEXPAND, sau khi nhớ cái này và cái này .
Tôi có thể chắc chắn nói với bạn rằng truy vấn này sẽ nhanh hơn truy vấn hiện tại của bạn (nhưng không phải là bao nhiêu), ngoại trừ trong trường hợp hiếm hoi mà bạn có chính xác một người dùng cho mỗi ngày (trong trường hợp đó, cùng một lượng dữ liệu sẽ có được đọc) và các cột mà chúng ta biết là các cột duy nhất trong chỉ mục của bảng cơ sở. Việc tăng hiệu suất trong thời gian đọc có xứng đáng với công việc làm thêm sẽ ảnh hưởng đến phần ghi của khối lượng công việc của bạn hay không là điều chúng tôi không thể nói với bạn - bạn sẽ phải kiểm tra nó để đo lường sự đánh đổi (không có chỉ số nào là miễn phí).
Và nếu bạn thường xuyên sử dụng các mệnh đề WHERE phổ biến tương tự với Enroll_Date cho các phạm vi được xác định rõ ràng (cụ thể là quý hoặc năm hiện tại), bạn có thể thêm các chỉ mục được lọc phù hợp làm giảm thêm I / O đó (nhưng luôn luôn có một đánh đổi).
Bạn cũng có thể xem xét đặt một chỉ mục cụm trên bảng cơ sở. Đây dường như không phải là một trong những trường hợp sử dụng rất hiếm được hưởng lợi từ một đống.