Что быстрее для нескольких вызовов SQL - параметризованных запросов или хранимых процедур? - PullRequest
3 голосов
/ 07 апреля 2009

Я использую SQL Server 2005. Я смотрю на открытие соединения SQL, цикл через коллекцию и выполнение запроса на обновление (хранимой процедуры или параметризованного запроса) с данными из элемента коллекции, а затем закрытие соединения.

Что даст мне лучшую производительность и почему?

Ответы [ 6 ]

10 голосов
/ 07 апреля 2009

В последних версиях SQL-сервера планы выполнения кэшируются для хранимых процедур и параметризованных запросов. Для создания плана выполнения запрос будет стоить один раз, но он будет очень незначительным и будет потерян из-за накладных расходов даже при нескольких вызовах.

С точки зрения производительности они будут практически идентичны.

Исключением из этого является случай, когда вы выполняете рекурсивные или вложенные запросы (для каждой строки в запросе 1 выполните запрос 2), где сложатся циклы между клиентом и сервером. В этом случае процесс будет намного лучше.

Во многих компаниях все еще действуют правила «Все как процесс», но это обычно происходит из-за контроля над базой данных, а не из-за производительности. По мере роста популярности LINQ это может уменьшиться.

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

3 голосов
/ 07 апреля 2009

Это часто может превращаться в религиозную дискуссию между программистами и администраторами баз данных. Многим программистам, как правило, нравится подход подготовленных операторов, так как он позволяет им полностью контролировать выполняемый запрос, в то время как администраторам баз данных нравится подход с хранимыми процедурами по той же причине. Если у вас нет определенной границы между разработчиком и администратором базы данных в вашей компании, и вы балуетесь ролями как разработчиков, так и администраторов баз данных, то, вероятно, я бы больше склонялся к маршруту хранимой процедуры, потому что если вам нужно будет внести небольшие изменения в запрос в будущем для точной настройки производительности или исправления ошибок вам не нужно перекомпилировать и повторно развертывать приложение.

3 голосов
/ 07 апреля 2009

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

Существует еще одно решение, в котором вы можете передавать XML в хранимую процедуру, чтобы вам не приходилось вызывать ее несколько раз. Предполагая, что вы можете и знаете, как сериализовать ваш объект в XML. Затем вы можете использовать Xquery, Open XML или sp_XML_preparedocument для извлечения ваших данных в виде набора из XML и выполнения оператора update.

2 голосов
/ 07 апреля 2009

Использование прямого запроса или хранимой процедуры не сильно отличается по производительности (если есть), но если вы выполняете один и тот же запрос снова и снова с разными данными, вам определенно следует использовать параметры.

Используйте метод Prepare , чтобы обеспечить повторное использование одного и того же плана выполнения:

  • Создайте объект SqlCommand с помощью запроса / процедуры.
  • Создание SqlParameter объектов с указанными типами данных, но без значений, и добавление их в коллекцию Parameters команды.
  • Вызвать метод Prepare объекта команды.
  • Перебирайте данные, просто устанавливая значения параметров, и выполняйте команду.
2 голосов
/ 07 апреля 2009

Хранимые процедуры - это обычно путь. Тем не менее, это также зависит от того, насколько хорошо написан ваш процесс. Попробуйте запустить план выполнения для вашей хранимой процедуры, чтобы убедиться, что вы получаете лучший результат. Кроме того, использование хранимой процедуры обычно является более безопасным способом, а также обеспечивает лучшую производительность на вашем сервере, если экземпляр SQL находится не в том же блоке, что и ваш код. Когда вы используете хранимую процедуру, вы загружаете работу на блок SQL, который оптимизирует запрос для вас в хранимой процедуре.

0 голосов
/ 07 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...