Tôi đang gặp một vấn đề kỳ lạ xảy ra khi truy cập các hồ sơ lịch sử trong một bảng tạm thời. Các truy vấn truy cập vào các mục cũ hơn trong bảng tạm thời thông qua mệnh đề phụ AS OF mất nhiều thời gian hơn các truy vấn trên các mục lịch sử gần đây.
Bảng lịch sử được tạo bởi SQL Server (bao gồm một chỉ mục được nhóm trên các cột ngày và sử dụng nén trang), tôi đã thêm 50 triệu hàng vào bảng lịch sử và các truy vấn của tôi đã truy xuất khoảng 25.000 hàng.
Tôi đã cố gắng xác định nguyên nhân gốc rễ của vấn đề nhưng chưa thể xác định được. Cho đến nay tôi đã thử nghiệm:
- Tạo một bảng thử nghiệm với 50 triệu hàng với chỉ mục được nhóm để xem liệu sự chậm lại chỉ đơn giản là do khối lượng. Tôi đã có thể truy xuất 25K hàng tại thời gian không đổi (~ 400ms).
- Loại bỏ nén trang khỏi bảng lịch sử. Điều đó không ảnh hưởng đến thời gian truy xuất nhưng đã làm tăng đáng kể kích thước của bảng.
- Tôi đã thử truy cập trực tiếp vào các hàng của bảng lịch sử bằng cột ID so với cột ngày. Đây là nơi mọi thứ thú vị hơn một chút. Tôi có thể truy cập các hàng cũ hơn trong bảng ở mức ~ 400ms trong đó với mệnh đề phụ AS OF sẽ mất ~ 1200ms. Tôi đã thử lọc trên bảng thử nghiệm của mình trên cột ngày và nhận thấy sự chậm lại tương tự khi so sánh với lọc trên cột ID. Điều này khiến tôi tin rằng các so sánh ngày là đằng sau một số chậm lại.
Tôi muốn xem xét điều này nhiều hơn nhưng tôi cũng muốn chắc chắn rằng tôi không sủa sai cây. Đầu tiên, có ai khác gặp phải hành vi tương tự khi truy cập dữ liệu lịch sử cũ hơn trong một bảng tạm thời (chúng tôi chỉ nhận thấy sự chậm lại vượt qua 10 triệu hàng)? Thứ hai, một số chiến lược tôi có thể sử dụng để cách ly nguyên nhân gốc rễ của vấn đề hiệu năng (tôi mới bắt đầu xem xét các kế hoạch thực hiện nhưng nó vẫn hơi khó hiểu đối với tôi)?
Kế hoạch thực hiện
Đây là các truy vấn truy xuất đơn giản: đầu tiên truy cập các hàng cũ hơn, thứ hai truy cập các hàng mới hơn.
Hàng cũ hơn ~ 1200ms thời gian thực hiện
Hàng gần đây ~ 350ms thời gian thực hiện
Bảng chi tiết
Đây là các cột trong bảng thời gian. Bảng lịch sử có cùng các cột nhưng không có khóa chính (theo yêu cầu của bảng lịch sử):