Chúng tôi có cơ sở dữ liệu SQL lưu trữ nhật ký sử dụng ứng dụng cho khoảng 3000 PC. Những PC này gửi dữ liệu sử dụng của họ đến máy chủ SQL khoảng 10-20 lần mỗi ngày. Chúng tôi chỉ lưu trữ 60 ngày sử dụng ứng dụng gần đây nhất, nhưng khách hàng yêu cầu chúng tôi không thanh lọc dữ liệu nữa. Bây giờ chúng ta có dữ liệu khoảng một năm (khoảng 6.000.000 hàng), cơ sở dữ liệu SQL đang gặp phải một số vấn đề về hiệu suất. Không quan trọng, nhớ bạn, nhưng nhiều hơn bất kỳ cơ sở dữ liệu khác chúng tôi có. Có một số lượng đáng kể các bản ghi được thêm vào mỗi giờ ( bản ghi mở ứng dụng ) và trong vòng vài giờ, bản ghi đó sẽ được cập nhật chỉ một lần khi đóng ứng dụng liên quan . Đây là những cập nhật mà bạn có thể thấy thông qua SQL Activity Monitor đang mất nhiều thời gian để hoàn thành.
Truy vấn CẬP NHẬT đó rất đơn giản:
SELECT TOP 1 f_ID
from tb_applicationusage
WHERE f_application = 'xxxxxxx' AND
f_computername = 'xxxxxxxxx' AND
f_endtime IS NULL
ORDER BY f_starttime DESC
Thực tế, nó tìm thấy ứng dụng phù hợp gần đây nhất bắt đầu cho một máy cụ thể chưa có ứng dụng liên quan đóng. Tôi không thể nghĩ ra một cách hiệu quả hơn để chạy truy vấn, vì vậy tôi đang xem xét phương án sau:
Di chuyển đến hai cơ sở dữ liệu:
- Cơ sở dữ liệu làm việc chỉ với hồ sơ trị giá 24 giờ gần đây nhất
- Cơ sở dữ liệu cuối cùng với tất cả các hồ sơ khác
Tôi không phải là chuyên gia SQL, vì vậy tôi có thể thiếu một số nhược điểm của phương pháp này. Mục tiêu sẽ là có một công việc Đại lý SQL chuyển các bản ghi đã hoàn thành sang cơ sở dữ liệu cuối cùng mỗi đêm. Sau đó, khi khách hàng muốn chạy các báo cáo hàng tháng của họ, tôi chỉ có thể có truy vấn báo cáo đó chỉ là cơ sở dữ liệu cuối cùng chứ không phải cơ sở dữ liệu hoạt động. Chỉ với 10.000 bản ghi để truy vấn trong cơ sở dữ liệu hoạt động thay vì 6.000.000, có vẻ hợp lý rằng nó sẽ hoạt động nhanh hơn. Nhưng một lần nữa, có vẻ đơn giản là tôi có thể thiếu một cái gì đó rõ ràng.
Phiên bản: Microsoft SQL Server 2008 R2
INDEX
nào tồn tại trêntb_applicationusage
?