Chúng tôi đã phát triển một hệ thống với một màn hình tìm kiếm trông một chút gì đó như thế này:ASP.NET/SQL 2008 Performance Vấn đề
http://demo1.nsourceservices.com/images/logos/stackoverflow1.png
Như bạn thấy, có một số chức năng tìm kiếm khá nghiêm trọng . Bạn có thể sử dụng bất kỳ kết hợp trạng thái, kênh, ngôn ngữ, loại chiến dịch nào và sau đó thu hẹp theo tên và v.v.
Sau đó, khi bạn đã tìm kiếm và khách hàng tiềm năng bật lên ở dưới cùng, bạn có thể sắp xếp tiêu đề.
Truy vấn sử dụng ROWNUM để thực hiện chương trình phân trang, vì vậy, chúng tôi chỉ trả lại hàng như 70 hàng tại một thời điểm.
Vấn đề
Mặc dù chúng tôi chỉ trả 70 dòng, một awful nhiều IO và phân loại đang xảy ra. Điều này có ý nghĩa tất nhiên.
Điều này luôn gây ra một số lỗi nhỏ đối với Hàng đợi đĩa. Nó bắt đầu chậm lại nhiều hơn khi chúng tôi đạt được 3 triệu khách hàng tiềm năng và giờ chúng tôi đang tiến gần hơn đến 5, các lần xếp hàng đĩa kéo dài đến một hoặc hai giây.
Điều đó thực sự vẫn có thể thực hiện được, nhưng hệ thống này có một khu vực khác với quy trình nhạy cảm về thời gian, cho phép đơn giản rằng đó là dịch vụ web, cần phân phối phản hồi rất nhanh hoặc gây ra thời gian chờ đầu kia. Các hàng đợi của Disk Queue đang khiến phần đó bị hỏng, điều này gây ra thời gian chờ ở hạ lưu. Kết quả cuối cùng thực sự là giảm các cuộc gọi điện thoại trong IVR dựa trên VoiceXML tự động của chúng tôi và điều đó rất xấu đối với chúng tôi.
gì Chúng tôi đã thử
Chúng tôi đã cố gắng:
- nhiệm vụ bảo trì làm giảm số dẫn trong hệ thống đến mức tối thiểu.
- Đã thêm các chỉ mục rõ ràng để trợ giúp.
- Chạy trình hướng dẫn điều chỉnh chỉ mục trong hồ sơ và áp dụng hầu hết các đề xuất của nó. Một trong số đó sẽ ít nhiều tạo lại toàn bộ bảng bên trong một chỉ mục vì vậy tôi đã chỉnh sửa nó bằng tay để làm một chút ít hơn thế.
- Đã thêm RAM vào máy chủ. Đó là một chút thấp nhưng bây giờ nó luôn luôn có một cái gì đó giống như 8 hợp đồng biểu diễn nhàn rỗi, và máy chủ SQL được cấu hình để sử dụng không quá 8 hợp đồng biểu diễn, tuy nhiên nó không bao giờ sử dụng nhiều hơn 2 hoặc 3. Tôi thấy rằng lẻ. Tại sao nó không phải là chỉ cần đặt toàn bộ bảng trong RAM? Chỉ có 5 triệu khách hàng tiềm năng và có rất nhiều phòng.
- Đã đổ qua các kế hoạch thực hiện truy vấn. Tôi có thể thấy rằng tại thời điểm này các chỉ số dường như chủ yếu là làm công việc của họ - khoảng 90% công việc đang diễn ra trong giai đoạn phân loại.
- Được coi là phân vùng bảng dẫn đến một ổ đĩa vật lý khác, nhưng chúng tôi không có tài nguyên cho điều đó và có vẻ như không cần thiết.
Trong Bế mạc ...
Một phần trong tôi cảm giác như máy chủ sẽ có thể xử lý việc này. Năm triệu bản ghi không phải là quá nhiều cho sức mạnh của máy chủ đó, mà là một lõi tứ phong nha với 16 hợp đồng biểu diễn của ram.Tuy nhiên, tôi có thể thấy cách phần sắp xếp đang khiến hàng triệu hàng chỉ được chạm để trả lại một số ít.
Vì vậy, bạn đã làm gì trong các tình huống như thế này? Bản năng của tôi là chúng ta nên có thể cắt giảm một số chức năng, nhưng nếu có một cách để giữ nguyên vẹn điều này sẽ giúp tôi tiết kiệm một cuộc chiến với đơn vị kinh doanh.
Cảm ơn trước!
bạn đang tìm kiếm trên GUID? Chỉ số nhóm của bạn là gì? Bạn đã xem SSD trong máy chủ chưa? Bạn đang thực hiện tìm kiếm theo ký tự đại diện? Nếu vậy, bạn có thể cần phải lập chỉ mục các varchar về phía sau và chuyển tiếp – Matthew
@Matthew PK: Không có GUID. Chỉ số nhóm chỉ là khóa chính - LeadID (int). Đối với một ổ trạng thái rắn ... Vâng, ném tiền vào nó cần phải là lựa chọn mương cuối cùng của tôi. Nhưng đó là trong tâm trí của tôi. :) –
Điều gì về việc trả lại toàn bộ tập kết quả và phân trang trên máy khách? Là một người sử dụng, tôi thà chờ thêm 2 giây trước khi chờ đợi mỗi khi tôi trang. – Matthew