2013-05-06 36 views
5

Tôi có một trang đăng nhập thực hiện truy vấn EF rất đơn giản để xác định xem người dùng có hợp lệ hay không. Trong lần chạy đầu tiên, truy vấn này mất khoảng 6 giây để chạy. Trong lần chạy tiếp theo, phải mất ít hơn một giây.Làm cách nào để khởi tạo các truy vấn Khung thực thể để tăng tốc chúng?

Tôi đã xem một bài viết nói về việc sử dụng Application Auto-Start và câu hỏi của tôi là: Có cách nào để kích hoạt truy vấn này gây ra bất kỳ bộ nhớ đệm nào cần xảy ra mà không thực sự gọi truy vấn hay không. chỉ cần gọi truy vấn với một tập hợp các đối số giả?

EDIT: Khi tôi nói sáu giây, tôi đề cập đến thời gian cần để có được truy vấn. Mã trông giống như thế này (lưu ý trong trường hợp này ContactId là một int nullable và thiết lập để null):

return from contact in _context.Contacts 
      where contact.District == Environment.District && 
      contact.ContactId == (contactID ?? contact.ContactId) 
      select contact; 

Đây là một SQLServer 2008 và tôi đã chạy một hồ sơ để kiểm tra SQL và thời gian nó sẽ trả về là 41ms cho truy vấn cuối cùng được thực thi. Việc chậm trễ 6 hoặc 7 giây xảy ra trước khi truy vấn thậm chí đạt đến SQL mặc dù. Tôi đang cố gắng để thiết lập cái nhìn thoáng qua ngay bây giờ để xem nó có thể cho tôi biết thêm chi tiết về những thứ khác có thể xảy ra cùng một lúc hay không.

+0

Tôi nghĩ rằng nó có thể là đáng giá để làm một số hồ sơ và cố gắng tìm ra nơi trì hoãn thực sự xảy ra. –

+0

chi phí của EF khá nhẹ và có thể không phải là vấn đề. Có thể cài đặt một cái gì đó giống như Glimpse (NuGet gói) và xem những gì thực sự để đổ lỗi.Bạn có thể có các sự kiện khác xảy ra mà thực sự là lỗi (bootstrapped add-in?). –

+0

@RobertHarvey Bạn có nghĩa là SQL profiling hoặc .NET profiling? – Mykroft

Trả lời

2

Điều này thực sự giống như những gì được gọi là "truy vấn lạnh". Các botteneck hiệu suất chính cho các truy vấn lạnh là "View Generation" được thực hiện một lần cho mỗi AppDomain của ứng dụng của bạn. Thông thường hiệu ứng là truy vấn đầu tiên của bạn - và không quan trọng một truy vấn nào - chậm và các truy vấn tiếp theo đều nhanh.

Nó không nhất thiết phải là truy vấn có thể chậm. Nếu hoạt động đầu tiên bạn đang làm với EF trong ứng dụng của bạn là một Chèn sẽ chậm. Hoặc thậm chí là Attach không chạm vào cơ sở dữ liệu chút nào cũng sẽ chậm. (Đó là một trường hợp thử nghiệm đơn giản tốt bằng cách: Thêm context.Users.Attach(new User()) vào ứng dụng bắt đầu và xem trong trình gỡ lỗi mất bao lâu để vượt qua dòng đó.)

Trong mọi trường hợp, thời gian được tiêu thụ bằng cách xây dựng cấu trúc dữ liệu nội bộ bộ nhớ - truy vấn cục bộ "views" (chúng không có gì để làm với các khung nhìn của bảng cơ sở dữ liệu) - điều đó diễn ra một lần cho mỗi AppDomain.

Xem thế hệ được mô tả chi tiết here chi tiết hơn và here nơi bạn cũng có thể tìm tài nguyên cách "tạo trước" những lượt xem đó như một phần của quá trình xây dựng và trước khi triển khai. (Lưu ý: Bạn phải cập nhật những chương trình này được tạo trước mỗi lần thay đổi mô hình của bạn và triển khai lại ứng dụng của bạn.)

Cách khác là kích hoạt tải ứng dụng web của bạn bắt đầu định kỳ (theo một số quá trình truy cập trang web) . Trong ứng dụng bắt đầu bạn sẽ chạy bất kỳ truy vấn giả hoặc Attach điều trên hoặc gọi khởi EF bằng tay:

using (var context = new MyContext()) 
{ 
    context.Database.Initialize(false); 
} 

Sửa

Tôi quên là giải pháp cuối cùng. Chỉ cần bỏ qua 6 hoặc 7 giây. Nếu trang web của bạn nổi tiếng và có lưu lượng truy cập hợp lý thì truy vấn lạnh sẽ không có khả năng xảy ra vì quá trình xử lý IIS sẽ hiếm khi tắt AppDomain. Người dùng thỉnh thoảng truy cập trang web vào ban đêm khi việc đóng cửa như vậy xảy ra ngay trước khi có lẽ quá mệt mỏi để thậm chí còn nhận thấy sự chậm trễ.

+1

Đây là doanh nghiệp mã hóa để "nổi tiếng" không hoạt động như một giải pháp :). Nhưng tôi nghĩ rằng các cuộc gọi khởi tạo kết hợp với các ứng dụng tự động khởi động công cụ có thể giải quyết vấn đề của tôi. Tôi sẽ thử nghiệm điều đó hôm nay. Cảm ơn. – Mykroft

+0

"quá mệt mỏi để thậm chí còn nhận thấy sự chậm trễ." - trừ khi họ ở một múi giờ khác. – mayu

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