Entity Framework Производительность SQL-запросов - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь получить представление о производительности Entity Framework, в частности, о динамическом SQL, который он генерирует. Возьмите следующее утверждение, например:

var orders = db.Orders.Include(o => o.OrderItem).Include(o => o.Customer);

, который будет возвращать для всех заказов прикрепленные к нему позиции заказа и данные клиента для пользователя, который его заказал.

Что примерно соответствует SQL, как показано ниже:

Select * 
from Order o 
inner join OrderItem oi on o.OrderId = oi.OrderId 
inner join Customer c on o.CustomerId = c.CustomerId

Теперь (в контексте SQL Server) этот план может кэшироваться, и этот пример очень прост, но по мере того, как запросы становятся все более и более динамичными и сложными, с параметрами, условиями, переменными и т. Д. Производительность базы данных становится проблема с EF и станет ли более эффективным использование хранимых процедур, скомпилированных или других объектов, вместо того, чтобы позволить EF генерировать динамический SQL?

Или мы можем предположить, что EF высоко оптимизирован, и кроме сценариев, когда SPROCS, представления, функции и т. Д. Необходимы на уровне базы данных в сложных сценариях, мы можем полагаться на то, что EF будет максимально эффективен в своих SQL-запросах?

1 Ответ

1 голос
/ 23 ноября 2011

Качество кода EF SQL - это наименьшая вещь, которая должна вас беспокоить.EF достаточно медленный сам по себе.SQL Server (особенно в последних версиях) очень хорошо оптимизирует запросы, поэтому вы, как правило, не будете медленнее, чем, скажем, некоторые рукописные SP.Но в целом, с использованием EF, программа будет намного медленнее и менее отзывчивой по сравнению с использованием чистых запросов в стиле ADO.NET + DataTables.Это, однако, не означает, что EF - это плохо, но вы должны тщательно продумать, где его использовать.

...