Прежде всего, компиляция EF-запросов не имеет ничего общего с преимуществами производительности, которые могут быть достигнуты с помощью хранимых процедур.
Согласно http://msdn.microsoft.com/en-us/library/cc853327.aspx - следующие операции выполняются, когда запрос выполняется дляконцептуальная модель:
- Загрузка метаданных
- Открытие соединения с базой данных
- Создание представлений
- Подготовка запроса
- Выполнение запроса
- Загрузка и проверка типов
- Отслеживание
- Материализация объектов
Иобъяснение относительно Preparing the query
:
Включает затраты на составление команды запроса, создание дерева команд на основе метаданных модели и сопоставления и определение формы возвращаемых данных.Поскольку команды запроса Entity SQL кэшируются, последующее выполнение того же запроса занимает еще меньше времени.Вы также можете использовать скомпилированные запросы LINQ, чтобы уменьшить эту стоимость в более поздних выполнениях.
Итак, если вы скомпилируете запрос и будете использовать его позже, то вы сэкономите время на этой операции в своемприложение во время каждого последующего выполнения запроса.Однако чего вы не делаете, так это того, что вы не влияете на сгенерированный код SQL, который выполняется для базы данных. Преимущества производительности, которые вы получаете при компиляции запросов, находятся на уровне приложения.
С другой стороны, вы обычно используете хранимые процедуры, если вы не удовлетворены сгенерированным кодом SQL ихотел бы оптимизировать производительность на уровне базы данных.
EDIT в ответ на ваш комментарий и редактирование.
Мне кажется, что у вас сложилось впечатление, что компиляцияEF-запрос каким-то образом изменит сгенерированный код SQL, который будет выполняться в базе данных (вы упоминаете, что скомпилированные запросы приводят к параметризованным запросам SQL?).Это не относится к делу.Независимо от того, выполняете ли вы запрос напрямую или используете compiledQuery.Invoke
, , один и тот же код SQL будет выполняться для БД .Более того, вы не имеете полного контроля над ним, вы скорее полагаетесь на ORM, чтобы сгенерировать его наилучшим образом.В некоторых случаях это не оптимально, и именно здесь приходят SP.
Итак, подведем итог:
- Компиляция запросов - это просто оптимизация на стороне приложения.Это экономит время на компиляцию запроса, который повторно используется в коде.
- Хранимые процедуры могут использоваться для настройки вашего кода SQL и обеспечения его максимально точного соответствия вашей цели, предоставляя таким образом возможностьдобиться максимальной производительности на уровне базы данных.
Ни в коем случае один метод не может заменить другой.