Tôi đang chạy một 350GB
cơ sở dữ liệu trên PC với ~ 40 triệu hàng.
SQL Server 2014, Win7, AMD 8350 @ 4.8GHZ, RAM 16 GB và SSD 500 GB (cơ sở dữ liệu được lưu trữ trên ổ SSD 500 GB của chính nó, với lưu lượng đọc / ghi 500MB / 500MB).
Cơ sở dữ liệu không được cập nhật, tôi chỉ phân tích / đọc nó. Với việc tạo ra một vài indexes
, bất kỳ join
, count(*)
v.v., chỉ mất chưa đến 1 phút, điều này phù hợp với mục đích của tôi. Tôi đã chạy một số truy vấn (sau khi chạy một truy vấn tham gia duy nhất, 40-50 lần, nó trở nên chậm) trên dữ liệu và bây giờ các cuộc gọi mất 1 phút, vẫn chạy 20 phút sau.
Tôi theo dõi cẩn thận các tài nguyên hệ thống và tôi có thể thấy SSD
cú đá khi truy vấn bắt đầu, nó đọc trong 20-30 giây, sau đó nó sẽ đọc 121kB/second
trong 20 phút tiếp theo. Đây không phải là một vấn đề CPU, hoặc vấn đề đĩa. Tôi bị giới hạn với số lượng RAM của mình, tuy nhiên các cuộc gọi chạy tốt khi tôi tải cơ sở dữ liệu lần đầu tiên, bây giờ, không có gì chạy, 25 phút sau.
Thực tế, tôi không thể truy vấn cơ sở dữ liệu nữa, bất kỳ cuộc gọi nào cũng mất quá nhiều thời gian thậm chí là một SELECT
câu lệnh cơ bản . Tôi đã thử xây dựng lại các chỉ mục và cập nhật số liệu thống kê, nhưng không có sự khác biệt.
Tôi không có nhiều kinh nghiệm về vấn đề này nên hoàn toàn có thể truy vấn SQL của tôi không chính xác, trong trường hợp đó tôi sẽ gặp lỗi hoặc để nó hoàn thành việc thực hiện với 0 kết quả, nhưng không xảy ra.
Những gì tôi đang cố gắng làm là đếm tất cả các trường hợp của 'TypeID', trong 5 giây trước một thời gian dựa trên bảng ACALLS.
SELECT ACALLS.StartTime, ACALLS.Time, ACALLS.ServerIP, ACALLS.SRVR, ACALLS.calls, ACALLS.TOKEN, COUNT(TypeID) as ExecRate
FROM ACALLS
INNER JOIN MAINVIEW ON
MainView.TimeStamp BETWEEN ACALLS.StartTime and DATEADD(ss,-5,ACALLS.StartTime)
WHERE DATEPART(hour,MainView.TimeStamp) BETWEEN 10 and 13 and
CAST(MainView.TimeStamp as date) = '2015-12-09' and
MainView.TypeID = '123456789'
GROUP BY Acalls.STartTime, ACALLs.TIME, ServerIp,SRVR, ACALLS.CALLS, ACALLS.TOKEN
ORDER BY Acalls.StartTime