2011-01-20 27 views
8

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!

+0

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

+0

@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. :) –

+0

Đ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

Trả lời

3

Nút cổ chai cơ sở dữ liệu có thể được cải thiện thường xuyên bằng cách cải thiện truy vấn SQL của bạn. Mà không biết những gì trông giống như, hãy xem xét việc tạo ra một kho dữ liệu hoạt động hoặc kho dữ liệu mà bạn cư trú trên cơ sở dự kiến.

Đôi khi làm phẳng cơ sở dữ liệu quan hệ phức tạp của bạn là cách để thực hiện. Nó có thể làm cho các truy vấn chạy nhanh hơn đáng kể, và làm cho nó dễ dàng hơn nhiều để tối ưu hóa các truy vấn của bạn, vì mô hình rất phẳng. Điều đó cũng có thể giúp bạn dễ dàng xác định xem bạn có cần mở rộng quy mô máy chủ cơ sở dữ liệu của mình lên hay không. Khả năng và phân tích tăng trưởng có thể giúp thực hiện cuộc gọi đó.

Cơ sở dữ liệu được giao dịch/rất chuẩn hóa thường không thể mở rộng dưới dạng ODS hoặc kho dữ liệu.

Chỉnh sửa: ORM của bạn cũng có thể có tối ưu hóa mà ORM có thể hỗ trợ, có thể đáng xem, thay vì chỉ xem xét cách tối ưu hóa các truy vấn mà nó gửi đến cơ sở dữ liệu của bạn. Có lẽ bỏ qua toàn bộ ORM của bạn cho các báo cáo có thể là một cách để có toàn quyền kiểm soát các truy vấn của bạn để đạt được hiệu suất tốt hơn.

+0

Tuy nhiên, một nơi khác mà ORMs rơi phẳng trên khuôn mặt của họ. –

+0

Vâng, một ORM là rất tốt cho một số kịch bản, có lẽ không phải điều này. Có lẽ những gì có thể làm việc nếu giải pháp cần phải ở định hướng ORM có thể là một mô hình cơ sở dữ liệu phẳng, với một lớp đối tượng đơn giản để xây dựng các truy vấn với. Tôi nghi ngờ rằng con đường kháng cự ít nhất có thể là chỉ xem xét các cách để tối ưu hóa các truy vấn ORM hiện tại –

2
  1. xác định các truy vấn ad-hoc sẽ rất có thể được chạy hoặc hạn chế các tiêu chí tìm kiếm với các thủ tục lưu trữ .. bạn có thể tóm tắt dữ liệu? .. điều trị này
    ứng dụng giống như một kho dữ liệu.
  2. tạo chỉ mục trên mỗi cột có liên quan trong tìm kiếm để tránh quét bảng.
  3. tạo các phân đoạn trên biểu thức.
  4. định kỳ khôi phục dữ liệu và cập nhật số liệu thống kê khi có nhiều khách hàng tiềm năng hơn được tải.
  5. đặt các tệp tạm thời được tạo bởi truy vấn (bộ kết quả) trong ramdisk.
  6. xem xét di chuyển sang công cụ RDBMS hiệu suất cao như Informix OnLine.
  7. Bắt đầu một chuỗi khác để bắt đầu hiển thị N hàng từ tập kết quả trong khi truy vấn
    tiếp tục thực thi.
+2

Công cụ tốt ... ngoài ra, trong khi bạn không nhận được lỗi này, các bước vẫn áp dụng: http://stackoverflow.com/questions/4719841/system-data-sqlclient-sqlexception-timeout-expired#4719892 –

+0

trừ khi bạn cẩn thận kiểm soát các truy vấn của bạn (và tôi đoán ORM không làm điều này) các chỉ số quá mức có thể làm cho DB thử một gói "tất cả các giao dịch" thay vì chọn chỉ mục "tốt nhất" cho một loại tìm kiếm nhất định. – Matthew

+0

Điều này thực sự thú vị, bạn có một công cụ cụ thể mà bạn sử dụng để xây dựng các đĩa RAM không? Google đã tìm thấy RamDisk và RamDisk plus. –

2

Hãy xem xét cách ORM của bạn đang tạo truy vấn. Nếu bạn có hiệu suất tìm kiếm kém, có lẽ bạn có thể thử sử dụng các thủ tục được lưu trữ để trả lại kết quả của mình và, nếu cần thiết, nhiều thủ tục được lưu trữ được điều chỉnh cụ thể theo tiêu chí tìm kiếm nào đang được sử dụng.

Các vấn đề liên quan