Giả sử tôi có một bảng rất dài (~ 35 triệu hàng) được gọi là TimeCard chỉ với 5 cột (tableID, CompanyID, UserID, ProjectID, DailyHoursWorked, entryDate). Đây là một bảng chuyển tiếp khá đơn giản ghi lại giờ làm việc của nhân viên mỗi ngày cho mỗi dự án cho mỗi công ty.Giảm tốc độ tại Chế độ xem chỉ mục cho SQL 2005
Tôi hiện cần tạo báo cáo để tìm hiểu tổng số giờ làm việc của mỗi nhân viên mỗi tháng cho mỗi dự án cho bất kỳ công ty cụ thể nào. Thay vì thực hiện tổng hợp khi báo cáo chạy, tôi muốn xây dựng một cấu trúc dữ liệu giống như bảng đã có tất cả dữ liệu Công ty/Dự án/Người dùng được tổng hợp theo tháng, vì vậy khi báo cáo chạy, tôi chỉ có thể truy vấn cấu trúc dữ liệu đó trực tiếp mà không thực hiện bất kỳ tập hợp thời gian chạy nào kể từ ~ 35 triệu bản ghi có thể mất vài phút.
Vì vậy, tôi có 2 cách khác nhau. Một tạo ra một bảng vật lý thêm với (CompanyID, UserID, ProjectID, MonthlyHoursWorked, Month) làm cột của tôi và chỉ sử dụng kích hoạt tại bảng TimeCard để sửa đổi các giá trị tại bảng phụ. Hoặc tôi có thể tạo Chế độ xem được lập chỉ mục. Vì vậy, tôi đã thử cả hai. Trước tiên, tôi đã thử chế độ xem được lập chỉ mục với mã sau:
CREATE VIEW [dbo].[vw_myView] WITH SCHEMABINDING AS
SELECT
JobID,
ProjectID,
Sum(DailyHoursWorked) AS MonthTotal,
DATEADD(Month, DATEDIFF(Month, 0, entryDate), 0) AS entryMonth,
CompanyID,
COUNT_BIG(*) AS Counter
FROM
dbo.TimeCard
Group By DATEADD(Month, DATEDIFF(Month, 0, entryDate), 0), JobID, ProjectID, CompanyID
Go
CREATE UNIQUE CLUSTERED INDEX [IX_someIndex] ON [dbo].[vw_myView]
(
[CompanyID] ASC,
[entryMonth] ASC,
[UserID] ASC,
[ProjectID] ASC
)
Chế độ xem được lập chỉ mục được tạo chính xác và tổng cộng ~ 5 triệu hàng tổng.
Tuy nhiên, mỗi lần nếu tôi xóa bộ nhớ cache SQL và chạy truy vấn sau: * chọn * từ vw_myView nơi companyID = 1 *, mất gần 3 phút. Nếu tôi đi với các tuyến đường thêm bảng như tôi đã đề cập ở trên, với bộ nhớ cache của tôi xóa, phải mất khoảng 4 giây.
Câu hỏi của tôi là, được lập chỉ mục Xem lựa chọn không phù hợp cho trường hợp cụ thể này? Đặc biệt tôi quan tâm để biết nếu toàn bộ xem được lập chỉ mục được tính lại/tổng hợp lại mỗi khi bảng bên dưới (TimeCard) được thay đổi hoặc khi truy vấn chạy với nó?
Cảm ơn!
Bạn đang sử dụng phiên bản SQL Server 2005 nào? – RedFilter
Thay vì có ngày đầy đủ của tháng đầu tiên trong 'entryMonth', bạn không thể có' MONTH (entryDate) 'và có thể' YEAR (entryDate) 'là INTs? Có vẻ dễ dàng hơn nhiều với tôi (nhưng sau đó lại - tôi không biết yêu cầu chính xác của bạn) .... –