2011-05-25 33 views
6

Ứng dụng của chúng tôi phát hành truy vấn SQL do NHibernate tạo. Khi chạy ứng dụng, truy vấn mất khoảng 12 giây để chạy với cơ sở dữ liệu SQL Server. SQL Profiler cho thấy hơn 500.000 lần đọc.Cùng một truy vấn SQL chậm hơn từ ứng dụng NHibernate so với SQL Studio?

Tuy nhiên, nếu tôi nắm bắt văn bản truy vấn chính xác bằng cách sử dụng SQL Profiler và chạy lại từ SQL Studio, phải mất 5 giây và hiển thị ít hơn 4.600 lần đọc.

Truy vấn sử dụng một vài tham số có giá trị được cung cấp ở cuối văn bản SQL và tôi đã đọc một chút về các tham số truy vấn và không hiệu quả, nhưng tôi đã nghĩ rằng có liên quan đến các thủ tục được lưu trữ. Có lẽ NHibernate giữ resultset mở trong khi nó instantiates thực thể của nó, mà có thể giải thích thời gian dài hơn, nhưng những gì có thể giải thích thêm 494.000 "lần đọc" cho cùng một truy vấn như được thực hiện bởi NHibernate? (Không có truy vấn bổ sung nào xuất hiện trong theo dõi lược tả SQL.)

Truy vấn được chỉ định làm truy vấn LINQ bằng cách sử dụng cơ sở LINQ NHibernate 3.1. Tôi không bao gồm các truy vấn chính nó bởi vì nó có vẻ như một câu hỏi cơ bản của triết học: những gì có thể giải thích một sự khác biệt đáng kể?

Trong trường hợp nó thích hợp, cũng có một cột varbinary (max) trong kết quả, nhưng trong trường hợp của chúng tôi nó luôn chứa null.

Bất kỳ thông tin chi tiết nào được đánh giá cao!

+3

Parameter đánh hơi cũng áp dụng cho ADHOC truy vấn parameterised không làm thủ tục chỉ lưu trữ. Các kế hoạch cho chúng được biên dịch theo tập tham số đầu tiên và được tái sử dụng cho các lời gọi tiếp theo với các giá trị tham số có thể khác nhau. –

+1

Bạn đã bao giờ tìm ra vấn đề chưa? Tôi đang chạy vào cùng một điều, và tất cả các tham số của tôi là ints vì vậy tôi không thấy làm thế nào mà có thể là một vấn đề. – Justin

Trả lời

2

Hãy chắc chắn để đọc: http://www.sommarskog.se/query-plan-mysteries.html

quy tắc tương tự áp dụng cho procs và sp_executesql. Một lý do rất lớn cho các kế hoạch kém chất lượng có thể được chuyển vào một tham số nvarchar cho trường varchar, nó làm cho việc quét chỉ mục trái ngược với tìm kiếm.

Tôi rất nghi ngờ đầu ra đang ảnh hưởng đến sự hoàn hảo ở đây, có khả năng là một vấn đề với một trong các thông số được gửi đi, hoặc tính chọn lọc của các bảng bên dưới.

Khi kiểm tra đầu ra của bạn từ hồ sơ, hãy đảm bảo bao gồm sp_executesql và đảm bảo cài đặt của bạn khớp với nhau (chẳng hạn như SET ARITHABORT), nếu không bạn sẽ tạo kế hoạch mới.

Bạn luôn có thể đào lên kế hoạch kém chất lượng từ bộ nhớ cache thực hiện qua sys.dm_exec_query_stats

+0

có áp dụng điều tương tự cho INT và BIGINT không? – Phill

+0

@Phó không có vẻ như SQL rất vui khi sử dụng chỉ mục chính xác trong trường hợp đó –

+0

Ok tuyệt vời, chúng tôi có một cơ sở dữ liệu kế thừa nơi nhà phát triển ban đầu đang nghĩ lớn. (cơ sở dữ liệu là 10 tuổi) tất cả các bảng mới là INT nhưng với tham chiếu khóa ngoài tới BIGINT. Bạn đã cho tôi lo lắng một lúc rằng nó có thể gây ra vấn đề hiệu suất! – Phill

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