Нужны ли нам хранимые процедуры при использовании скомпилированных запросов? - PullRequest
14 голосов
/ 27 сентября 2010

При использовании скомпилированных запросов в платформе сущностей (или linq-to-sql) в сочетании с SQL Server, есть ли еще какое-то преимущество в производительности при использовании хранимых процедур?

Скомпилированные запросы будут кэшироваться как параметризованные запросы, поэтому производительность должна быть примерно равна хранимым процедурам.Есть ли ситуация, когда хранимые процедуры будут работать значительно лучше?

- РЕДАКТИРОВАТЬ -

В ответ на ответ Якимича ниже я не хотел сказать, что скомпилированные запросы такие же, какхранимые процедуры.Я пытаюсь выяснить, все ли необходимы sprocs, если вы выполнили все возможные оптимизации на стороне приложения (в данном случае скомпилированные запросы).Поэтому я думаю, что я ищу причины, по которым хранимая процедура была бы лучше, чем комбинация оптимизаций на стороне приложения и параметризованных запросов (именно это и есть скомпилированные запросы).

OneЯ спрашиваю об этом потому, что многие люди считают, что хранимые процедуры больше не нужны по разным причинам (например, этот пост ).

Ответы [ 3 ]

9 голосов
/ 27 сентября 2010

Прежде всего, компиляция 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 и обеспечения его максимально точного соответствия вашей цели, предоставляя таким образом возможностьдобиться максимальной производительности на уровне базы данных.

Ни в коем случае один метод не может заменить другой.

5 голосов
/ 27 сентября 2010

«Есть ли ситуации, когда хранимые процедуры будут работать значительно лучше?»

При наличии сопоставимого фрагмента параметризованного SQL, сгенерированного либо в EF, либо в хранимом процессе, они будут работать одинаково.

Однако администратор базы данных всегда имеет возможность дополнительно оптимизировать запрос, основываясь на своем опыте работы со схемой базы данных и ее шаблонами использования. Хранимая процедура позволяет им делать это легко в изоляции приложений, использующих ее, тогда как ORM этого не делает.

У нас есть чрезвычайно сложная БД SQL Server, в которой много внешних систем реплицируют и выводят данные через триггеры. Для нас проблема с EF заключается в том, что ответственность за SQL, который запускается в БД, станет ответственностью разработчиков приложений при использовании любого ORM, а не администраторов баз данных.

3 голосов
/ 27 сентября 2010

Несколько готовых ответов от известных экспертов: Пол Нильсен Зачем использовать хранимые процедуры?

Адам Мачаник: Нет, хранимые процедуры НЕ плохие

...