6

Đây không phải là câu hỏi "là ORM nhanh nhất", cũng không phải là câu hỏi về "cách viết mã tốt với ORM". Đây là mặt khác: mã được viết, nó đã được phát hành trực tiếp, hàng nghìn người dùng đang truy cập ứng dụng, nhưng có một vấn đề hiệu suất tổng thể được nhận thức. Một dấu vết SQL Profiler chỉ có thể chạy trong một khoảng thời gian ngắn: 5 phút cho vài trăm nghìn kết quả. Câu hỏi này đơn giản là: đã sử dụng SQL Profiler để thu hẹp một số truy vấn chậm (thời lượng lớn hơn một khoảng thời gian nhất định), những kỹ thuật và giải pháp nào tồn tại để truy tìm các truy vấn SQL này trở lại thành phần có vấn đề không? Không. Một câu hỏi releated là nếu một khu vực cụ thể là chậm, làm thế nào chúng ta có thể xác định SQL rằng khu vực này đang thực hiện để nó có thể được lọc thích hợp trong SQL Profiler?Truy tìm hiệu suất ORM

Nền tảng cho điều này là chúng tôi có một ứng dụng khá lớn với cấu trúc bảng khá phức tạp và hiện đang dựa trên việc truy cập dữ liệu thông qua các thủ tục được lưu trữ. Nếu một vấn đề về hiệu suất SQL xuất hiện, thì thường là trường hợp rút ra trình lược tả SQL, tìm hiểu xem có điều gì chậm (lọc theo thời gian) hay không nếu vùng bị phàn nàn chậm (lọc theo thủ tục lưu sẵn) và điều chỉnh các thủ tục lưu sẵn (hoặc lập chỉ mục lược đồ).

Bây giờ có một sự thúc đẩy để chuyển mã của chúng tôi từ giải pháp chủ yếu là sproc sang giải pháp chủ yếu là ORM, tuy nhiên cú đẩy lớn chống lại việc di chuyển là vấn đề hiệu suất. Tôi đã đọc xung quanh và có vẻ như thường xuyên hơn không, nó có thể liên quan đến các công cụ của bên thứ ba (ORM truy tìm các tiện ích như NHProf hoặc .NET truy tìm utils như dottrace) mà chúng tôi cần cài đặt trên máy chủ. Bây giờ liệu các công cụ bổ sung có thể được cài đặt trên môi trường sống hay không là một câu hỏi khác, vì vậy nếu những thứ như thế này có thể được thực hiện mà không cần thêm công cụ, thì đó có thể là tiền thưởng.

Tôi chủ yếu quan tâm đến các giải pháp với SQL Server 2008, nhưng có thể là đủ chung cho mọi RDBMS. Theo như công nghệ ORM, về điều này tôi không tập trung cụ thể như không có gì hiện đang được sử dụng, vì vậy hãy quan tâm để biết các kỹ thuật khác nhau như thế nào (hoặc phổ biến) twixt nHibernate, fluent-nhibernate và Entity Framework. Các ORM khác được chào đón mặc dù nếu chúng cung cấp một cái gì đó khác :-)

Tôi đã đọc qua How to find and fix performance problems (...) và tôi nghĩ vấn đề chỉ đơn giản là phần có "cô lập". Một vấn đề dễ tái sản xuất chỉ trên hệ thống trực tiếp sẽ khó phân lập. Các số liệu tôi trích dẫn trong đoạn 2 là số liệu về các loại mà chúng tôi có thể lấy từ một hồ sơ ...

Nếu bạn có trải nghiệm ORM thực tế trên thế giới, tốt hơn nhiều :-)

Cập nhật, 2016-10-21: Chỉ để hoàn thành, chúng tôi cuối cùng đã giải quyết điều này cho NHibernate bằng cách viết mã và ghi đè phương pháp NHibernate. Chi tiết đầy đủ trong câu hỏi SO khác mà tôi đã hỏi: NHibernate and Interceptors - measuring SQL round trip times. Tôi hy vọng đây sẽ là một cách tiếp cận tương tự cho nhiều ORM khác nhau.

+0

Bạn đã quen thuộc với các DMV và báo cáo khác nhau hiển thị truy vấn hàng đầu theo thời lượng, CPU, IO, v.v ... dựa trên thống kê kế hoạch thực hiện chứ không phải là lược tả? Ngoài ra những gì phiên bản của SQL Server? Nếu năm 2008 có kho dữ liệu quản lý có thể giúp (mặc dù tôi đoán với các truy vấn không được tham số do ORM phát hành, bạn có thể kết thúc với nhiều truy vấn và kế hoạch tương tự làm cho kết quả khó khăn) –

+0

Câu hỏi thú vị, tôi mong được học điều gì đó về chủ đề này vì tôi không có câu trả lời cho bạn. – HLGEM

+0

@Martin - xin lỗi, 2008 (đã chỉnh sửa câu hỏi). Bây giờ bạn đề cập đến DMV, mà chuông reo, sẽ điều tra. Các ứng dụng tại thời điểm này được dựa trên SQL 2000, nhưng phiên bản tiếp theo được nâng lên đến 2008. Không * quá * làm phiền khoảng 2000 giải pháp. Mặc dù một khi chúng ta có truy vấn, làm thế nào để chúng ta theo dõi ngược lại với mô-đun gây ra vấn đề qua lớp ORM? –

Trả lời

0

Chúng tôi đã có một ứng dụng Java/Hibernate có vấn đề, vì vậy chúng tôi đã sử dụng SET CONTEXT_INFO với một giá trị khác. Nếu chúng ta thấy, nói, 0x14 trên cùng một SPID ngay trước một truy vấn WTF, chúng ta có thể thu hẹp nó thành mô-đun x.

Không phải là một anh chàng Java, tôi không biết chính xác những gì họ đã làm, và tất nhiên nó có thể không áp dụng cho .net. IIRC bạn phải cẩn thận khi kết nối được mở/đóng

Chúng tôi cũng có thể kiểm soát tải của khách hàng tại thời điểm này để chúng tôi không có quá nhiều lưu lượng thừa.

YMMV tất nhiên, nhưng nó có thể hữu ích

Tôi chỉ tìm thấy những điều này có thể có ích quá

+0

Cách tiếp cận thú vị; Tôi đã tự hỏi nếu có một cách "watermarking" câu lệnh SQL ... có thể là một để xem xét thêm. –

2

Có tồn tại profilers cho các công cụ ORM, như UberProf. Nó phát hiện ra các câu lệnh SQL nào được tạo ra bởi ORM có thể có vấn đề.

Chẳng hạn như vấn đề chọn n + 1. Các loại công cụ này có thể cung cấp cho bạn một dấu hiệu cho thấy các câu lệnh truy vấn ORM dẫn đến mã SQL kém và thậm chí có thể giúp bạn cải thiện chúng.

+0

Làm thế nào tốt các công cụ như thế này trong một môi trường sống có thể được tải rất nhiều (xem khối lượng nêu trong câu hỏi)? Và tôi giả định rằng với những điều này, bạn có thể tìm thấy mã đang sử dụng ORM theo cách này? Ngoài ra, nếu chúng ta có ứng dụng được triển khai trên (nửa) tá máy chủ ứng dụng, có thể chúng ta phải theo dõi hơn nửa tá máy chủ ứng dụng (mặc dù chúng ta có thể theo dõi và hy vọng vấn đề xuất hiện ở đó, sau đó không đưa ra một bức tranh đầy đủ về những gì đang xảy ra trên cơ sở dữ liệu - vì vậy hãy sử dụng kết hợp với các công cụ như SQL Profiler?) –

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