Chúng tôi có một cơ sở dữ liệu cho một sản phẩm nặng. Chúng tôi vừa mua một máy chủ mới có ổ SSD để trợ giúp. Trước sự ngạc nhiên của chúng tôi, việc chèn vào không nhanh hơn trên máy cũ của chúng tôi với dung lượng lưu trữ chậm hơn nhiều. Trong quá trình đo điểm chuẩn, chúng tôi nhận thấy rằng tốc độ IO được thể hiện bởi quy trình SQL Server là rất thấp.
Ví dụ: tôi đã chạy tập lệnh được tìm thấy trên trang này , ngoại trừ việc tôi đã thêm BEGIN TRAN và CAM KẾT xung quanh vòng lặp. Tốt nhất tôi có thể thấy mức sử dụng đĩa đạt tới 7bb / giây, trong khi CPU chỉ chạm mức 5%. Máy chủ đã cài đặt 64Gb và đang sử dụng 10. Tổng thời gian chạy là 2 phút 15 giây cho lần gọi đầu tiên xuống còn khoảng 1 phút cho các cuộc gọi tiếp theo. Cơ sở dữ liệu đang phục hồi đơn giản và không hoạt động trong quá trình thử nghiệm. Tôi đánh rơi bàn giữa mỗi cuộc gọi.
Tại sao một kịch bản đơn giản như vậy rất chậm? Phần cứng hầu như không được sử dụng. Cả hai công cụ đo điểm chuẩn dành riêng cho đĩa và SQLIO đều chỉ ra rằng SSD hoạt động chính xác với tốc độ lên tới 500Mb / giây cho cả đọc và ghi. Tôi hiểu rằng việc ghi ngẫu nhiên chậm hơn so với ghi tuần tự, nhưng tôi sẽ mong đợi một thao tác chèn đơn giản như thế này, vào một bảng không có lập chỉ mục cụm, sẽ nhanh hơn nhiều.
Cuối cùng, kịch bản của chúng tôi phức tạp hơn nhiều, nhưng tôi cảm thấy rằng trước tiên tôi cần phải hiểu một trường hợp đơn giản. Tóm lại, ứng dụng của chúng tôi xóa dữ liệu cũ, sau đó sử dụng SqlBulkCopy để sao chép dữ liệu mới vào bảng phân tầng, thực hiện một số bộ lọc và cuối cùng sử dụng MERGE và / hoặc INSERT INTO tùy theo trường hợp để sao chép dữ liệu vào các bảng cuối cùng.
-> EDIT 1: Tôi đã làm theo quy trình được liên kết bởi Martin Smith và tôi đã nhận được kết quả như sau:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
Tôi thấy NETWORK_IO kỳ lạ mất phần lớn thời gian, vì không có kết quả nào để hiển thị và không có dữ liệu để chuyển bất kỳ nơi nào khác ngoài các tệp SQL. Loại NETWORK_IO có bao gồm tất cả IO không?
-> EDIT 2: Tôi đã tạo một đĩa RAM 20Gb và gắn cơ sở dữ liệu từ đó. Thời gian tốt nhất tôi có trên SSD là 48 giây, với đĩa RAM giảm xuống còn 37 giây. NETWORK_IO vẫn là sự chờ đợi lớn nhất. Tốc độ ghi tối đa vào đĩa RAM là khoảng 250Mb / giây trong khi nó có thể thực hiện nhiều gigabyte mỗi giây. Nó vẫn không sử dụng nhiều CPU, vậy cái gì đang giữ SQL?
NETWORK_IO
có thể là từ "1 row (s) bị ảnh hưởng" 3 triệu tin nhắn được gửi trở lại. Bạn đã thử thêm SET NOCOUNT ON
vào kịch bản?
EE_WaitStats*.xel
để những cái cũ sẽ làm ô nhiễm kết quả của bạn.
SET NOCOUNT ON
vào nó.