Действительно ли Хранимые процедуры более эффективны, в целом, чем встроенные операторы на современном RDBMS? [дубликат]

Это работает для меня в raspbian,

echo -e "hello\\nworld"

106
задан informatik01 17 August 2018 в 13:43
поделиться

19 ответов

ПРИМЕЧАНИЕ , что это - общий взгляд на хранимые процедуры, не отрегулированные к определенному DBMS. Некоторый DBMS (и ровные, различные версии того же DBMS!) может работать вопреки этому, таким образом, Вы захотите перепроверить со своим целевым DBMS прежде, чем предположить, что все это все еще содержит.

я был ASE Sybase, MySQL и DBA SQL Server на - и прочь с тех пор в течение почти десятилетия (наряду с разработкой приложений в C, PHP, МН / SQL, C#.NET и Ruby). Так, у меня нет конкретного топора для шлифования в этом (иногда) священной войны.

исторический выигрыш в производительности сохраненного procs обычно были от следующего (без определенного порядка):

  • Предварительно проанализированный SQL
  • Предварительно сгенерированный план
  • выполнения запросов Уменьшенная сетевая задержка
  • Потенциальные преимущества кэша

Предварительно проанализированный SQL - подобные преимущества для скомпилированного по сравнению с интерпретируемым кодом, за исключением очень микро уровня.

Все еще преимущество? Не очень примечательный вообще на современном ЦП, но если Вы отправляете единственный SQL-оператор, который является ОЧЕНЬ большим eleventy-миллиардом времен секунда, парсинг наверху может сложить.

Предварительно сгенерированный план выполнения запросов. Если у Вас есть много СОЕДИНЕНИЙ, перестановки могут стать довольно неуправляемыми (современные оптимизаторы имеют пределы и сокращения по причинам производительности). Это не неизвестно для очень сложного SQL для имения отличный, измеримый (я видел, что сложный запрос берет 10 + секунды только для генерации плана, прежде чем мы настроили DBMS), задержки из-за оптимизатора, пытающегося выяснять "около лучшего" плана выполнения. Хранимые процедуры будут, обычно, хранить это в памяти, таким образом, можно будет избежать этих издержек.

Все еще преимущество? Большая часть DBMS (последние выпуски) будет кэшировать планы запросов для ОТДЕЛЬНЫХ SQL-операторов, значительно уменьшая дифференциал производительности между сохраненным procs и специальным SQL. Существуют некоторые протесты и случаи, в которых это не имеет место, таким образом, необходимо будет протестировать на целевом DBMS.

кроме того, все больше DBMS позволяет Вам предоставлять планы пути оптимизатора (абстрактные планы запросов) для значительного сокращения времени оптимизации (и для для данного случая и для SQL хранимой процедуры!!).

ПРЕДУПРЕЖДЕНИЕ Кэшируемые планы запросов не являются панацеей производительности. Иногда план запросов, который сгенерирован, является субоптимальным. Например, если Вы отправляете SELECT * FROM table WHERE id BETWEEN 1 AND 99999999, DBMS может выбрать полное сканирование таблицы вместо индексного сканирования, потому что Вы захватываете каждую строку в таблице (так sayeth статистика). Если это - кэшированная версия, то можно получить низкую производительность, когда Вы позже отправляете SELECT * FROM table WHERE id BETWEEN 1 AND 2. Обоснование позади этого выходит за рамки этой регистрации, но для дополнительных материалов для чтения см.: http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx и http://msdn.microsoft.com/en-us/library/ms181055.aspx и http://www.simple-talk.com/sql/performance/execution-plan-basics/

, "Таким образом, они решили, что предоставление чего-либо кроме общих ценностей, когда компиляция или перекомпилировали, было выполнено, привел к компиляции оптимизатора и кэшированию плана запросов для того конкретного значения. Все же, когда тот план запросов был снова использован для последующего выполнения того же запроса для общих ценностей (‘M’, ‘R’, или ‘T’), это привело к субоптимальной производительности. Эта субоптимальная проблема производительности существовала, пока запрос не был перекомпилирован. В той точке, на основе @P1 предоставленного значения параметра, запрос мог бы или не мог бы иметь проблемы производительности".

Уменьшенная сетевая задержка А при выполнении того же SQL много раз - и SQL составляет в целом многих КБ кода - замена, которая с простым "должностным лицом foobar" может действительно сложить. B) Сохраненный procs может использоваться для перемещения процессуального кодекса в DBMS. Это сохраняет стягивание больших объемов данных клиенту только для имения его, передают струйку обратно информации (или ни один вообще!). Аналогичный выполнению СОЕДИНЕНИЯ в DBMS по сравнению с в Вашем коде (общий любимый WTF!)

Все еще преимущество? А современный 1 ГБ (и 10 ГБ и!) Ethernet действительно делают это незначительным. B) Зависит от того, насколько влажный Ваша сеть - почему толчок несколько мегабайтов данных назад и вперед ни на каком серьезном основании?

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

Все еще преимущество? , Если Ваше приложение не имеет доступ общей памяти к данным DBMS, край всегда будет к сохраненному procs.

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

Параметризованный / Подготовленный SQL
Своего рода пересечение хранимых процедур и специального SQL, они - встроенные SQL-операторы на базовом языке, который использует "параметры" для значений запроса, например:

SELECT .. FROM yourtable WHERE foo = ? AND bar = ?

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

Специальный SQL Просто открывают консоль для Вашего DBMS и типа в SQL-операторе. В прошлом они были "худшими" исполнителями (в среднем), так как DBMS не имел никакого способа предварительно оптимизировать запросы как в том, чтобы параметризовать/хранившем proc метод.

Все еще недостаток? Не обязательно. Большая часть DBMS имеет способность к "абстрактному" специальному SQL в параметризованные версии - таким образом более или менее отрицание различия между двумя. Некоторые делают это неявно или должны быть включены с установкой команды (SQL-сервер: http://msdn.microsoft.com/en-us/library/ms175037.aspx , Oracle: http://www.praetoriate.com/oracle_tips_cursor_sharing.htm ).

извлеченные Уроки? Закон Гордона Мура продолжает идти на и оптимизаторы DBMS, с каждым выпуском, становиться более сложным. Несомненно, можно поместить каждый глупый SQL-оператор подростка в сохраненном proc, но просто знать, что программисты, работающие над оптимизаторами, очень умны и постоянно ищут способы улучшить производительность. В конечном счете (если это уже не здесь) специальная производительность sql станет неразличимой (в среднем!) от производительности хранимой процедуры, таким образом, любой вид [1 116] крупный использование хранимой процедуры ** только по "причинам производительности" ** уверенный походит на преждевременную оптимизацию мне.

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

255
ответ дан Matt Rogish 24 November 2019 в 03:44
поделиться

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

кэширование - SQL MS не рассматривает их никто по-другому, не с мая SQL MS 2000 7, но я не помню.

полномочия - Не проблема, так как почти все, что я делаю, является сетью, или имейте некоторый средний уровень приложений, который делает весь доступ к базе данных. Единственное программное обеспечение я работаю с этим, имеет прямой клиент к доступу к базе данных, сторонние продукты, которые разработаны для пользователей для имения прямого доступа и базируются вокруг предоставления пользовательских полномочий. И да модель обеспечения безопасности разрешения SQL MS СОСЕТ!!! (еще не провели время на 2008), Поскольку заключительная часть к этому хотела бы видеть обзор того, сколько людей все еще делает прямое программирование клиента/сервера по сравнению с веб-и средним программированием сервера приложений; и если они делают крупные проекты почему никакой ORM.

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

Способность отредактировать - Что у Вас нет тестирования и управления версиями, о котором необходимо волноваться? Также только проблема с клиентом/сервером, в веб-мире не проблема.

Находят таблицу - Только если можно определить SP, которые используют его, будет придерживаться инструментов системы управления версиями, агент роются или Visual Studio для нахождения.

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

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

-2
ответ дан Tom H 24 November 2019 в 03:44
поделиться

Хранимые процедуры могут также использоваться вместо параметризированных запросов (или специальные запросы) для некоторых других преимуществ также:

  • , Если необходимо исправить что-то (порядок сортировки и т.д.) Вы не должны перекомпилировать свое приложение
  • , которого Вы могли запретить доступ ко всем таблицам для той учетной записи пользователя, предоставить доступ только к хранимым процедурам и направить весь доступ через хранимые процедуры. Таким образом, у Вас может быть пользовательская проверка всего входа, намного более гибкого, чем ограничения таблицы.
0
ответ дан Andrei Rînea 24 November 2019 в 03:44
поделиться

По моему скромному мнению...

Ограничение операции "C_UD" к хранимым процедурам могут сохранить логику целостности данных в одном месте. Это может также быть сделано путем ограничения операций "C_UD" единственным средним слоем изделия.

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

0
ответ дан JeffV 24 November 2019 в 03:44
поделиться

Сохраненные procs являются большими для случаев, куда код SQL часто выполняется, потому что база данных хранит маркируемый в памяти. При повторном выполнении того же кода за пределами сохраненного proc Вы будете likey подвергаться хиту производительности из базы данных, повторно анализирующей тот же код много раз.

я обычно часто называл код как сохраненный proc или поскольку SqlCommand (.NET) возражает и выполняется как много раз по мере необходимости.

0
ответ дан spoulson 24 November 2019 в 03:44
поделиться

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

0
ответ дан Jake Hackl 24 November 2019 в 03:44
поделиться

Я не знаю, что они быстрее. Мне нравится использовать ORM для доступа к данным (для не перестраивания колеса), но я понимаю, что это - не всегда жизнеспособный вариант.

у Frans Bouma есть хорошая статья об этом предмете: http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

0
ответ дан Ryan Lanciaux 24 November 2019 в 03:44
поделиться

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

, Когда это сделано вручную без способа легко контролировать то, что - код то, где, это быстро становится кошмаром.

1
ответ дан Evan 24 November 2019 в 03:44
поделиться

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

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

1
ответ дан Chris Miller 24 November 2019 в 03:44
поделиться

Read Frans Bouma превосходное сообщение (если немного смещенный) на этом.

1
ответ дан Alvaro Rodriguez 24 November 2019 в 03:44
поделиться

Я предпочитаю использовать SP, когда имеет смысл использовать их. В SQL Server так или иначе нет никакого преимущества производительности для SP по параметрическому запросу.

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

, Таким образом, чувства клиента превосходят все другие аргументы в этом случае.

3
ответ дан Flory 24 November 2019 в 03:44
поделиться

Все, с чем я могу говорить, является SQL-сервером. В той платформе хранимые процедуры прекрасны, потому что сервер хранит план выполнения, который в большинстве случаев ускоряет производительность хороший бит. Я говорю "в большинстве случаев", потому что, если SP имеет широко переменные пути выполнения, Вы могли бы получить субоптимальную производительность. Однако даже в тех случаях, некоторый просвещенный рефакторинг SPS может ускорить вещи.

1
ответ дан Danimal 24 November 2019 в 03:44
поделиться

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

  1. Разработчики приложений являются не всегда лучшими кодерами SQL. Хранимые процедуры скрывают SQL от приложения.

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

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

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

Однако я обычно засовываю необработанный SQL в свои приложения так, чтобы я мог управлять им сам. Это зависит от Вашей группы разработчиков и философии.

4
ответ дан Jon Ericson 24 November 2019 в 03:44
поделиться

Одной темой, которую никто еще не упомянул как преимущество хранимых процедур, является безопасность. Если Вы создаете приложение исключительно с доступом к данным с помощью хранимых процедур, Вы можете блокировка база данных, таким образом, ЕДИНСТВЕННЫЙ доступ с помощью тех хранимых процедур. Для этого, даже если кто-то получит базу данных ID и пароль, они будут ограничены в том, что они видят или делают против той базы данных.

5
ответ дан fuzzbone 24 November 2019 в 03:44
поделиться

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

Примечание, что параметризированный запрос не является тем же как специальным sql.

главная причина imo для тихого одобрения хранимых процедур сегодня больше имеет отношение к безопасности. При использовании хранимых процедур исключительно можно отключить, ВСТАВЛЯЮТ, ВЫБИРАЮТ, ОБНОВЛЯЮТ, УДАЛЯЮТ, ИЗМЕНЯЮТ, ОТБРАСЫВАЮТ и СОЗДАЮТ и т.д. полномочия для пользователя приложения, только оставлять его с ВЫПОЛНЯЕТСЯ.

Это обеспечивает немного дополнительной защиты против 2-е внедрение SQL порядка . Параметризированные запросы только защищают от 1-я инжекция порядка .

9
ответ дан Joel Coehoorn 24 November 2019 в 03:44
поделиться

Это - дебаты, которые бушуют вперед и вперед (например, здесь ).

столь же легко записать плохие хранимые процедуры, как это должно записать логику доступа неправильных данных в Вашем приложении.

Мое предпочтение для Сохраненного Procs, но поэтому я являюсь обычно рабочим с очень крупными и сложными приложениями в корпоративной среде, где там выделены DBAs, кто ответственен за то, что поддерживал серверы баз данных в рабочем состоянии сладко.

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

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

Редактирование: В то время как статья Frans Bouma является действительно подробной, она упускает суть относительно безопасности с помощью мили. То, что этому 5 лет, не помогает своей уместности, также.

9
ответ дан Community 24 November 2019 в 03:44
поделиться

Во многих случаях хранимые процедуры на самом деле медленнее, потому что они более обобщены. В то время как хранимые процедуры могут быть высоко настроены, по моему опыту, существует достаточно разработки и установленного трения, которое их оставляют на месте, как только они работают, таким образом, хранимые процедуры часто имеют тенденцию возвращать много столбцов "на всякий случай" - потому что Вы не хотите развертывать новую хранимую процедуру каждый раз, когда Вы изменяете свое приложение. OR/M, с другой стороны, только запрашивает столбцы, которые использует приложение, который сокращает сетевой трафик, ненужные соединения, и т.д.

18
ответ дан Jon Galloway 24 November 2019 в 03:44
поделиться

Причины использования хранимых процедур:

  • Уменьшают сетевой трафик - необходимо отправить SQL-оператор по сети. С sprocs можно выполнить SQL в пакетах, который также более эффективен.
  • Кэширующийся план запросов - в первый раз, когда sproc выполняется, SQL Server создает план выполнения, который кэшируется для повторного использования. Это особенно производительно для маленьких запросов, выполняемых часто.
  • Способность использовать выходные параметры - при отправке встроенного SQL, который возвращает одну строку, можно только возвратить recordset. С sprocs можно вернуть их как выходные параметры, который значительно быстрее.
  • Полномочия - при отправке встроенного SQL необходимо дать разрешения на таблице (таблицах) пользователю, который предоставляет намного больше доступа, чем просто предоставление разрешения выполнить разделение sproc
  • логики - удаляет генерирующий SQL код и выделяет его в базе данных.
  • Способность отредактировать, не перекомпилировав - это может быть спорно. Можно отредактировать SQL в sproc, не имея необходимость перекомпилировать приложение.
  • Находят, где таблица используется - с sprocs, если Вы хотите найти все SQL-операторы, ссылающиеся на конкретную таблицу, можно экспортировать код sproc и искать его. Это намного легче, чем попытка найти его в коде.
  • Оптимизация - для DBA легче оптимизировать SQL и настроить базу данных, когда sprocs используются. Легче найти недостающие индексы и такой.
  • атаки с использованием кода на SQL - который правильно записанный встроенный SQL может защитить от нападений, но sprocs лучше для этой защиты.
24
ответ дан Ramesh Soni 24 November 2019 в 03:44
поделиться

В 2007 году я работал над проектом, в котором мы использовали MS SQL Server через ORM. У нас было 2 большие растущие таблицы, загрузка которых на SQL Server занимала до 7-8 секунд. После создания двух больших хранимых процедур SQL и их оптимизации с помощью планировщика запросов время загрузки каждой БД сократилось до менее 20 миллисекунд, так что очевидно, что для использования хранимых процедур SQL все еще есть причины эффективности.

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

Наши Поставщик ORM обычно заявлял, что выполнение множества небольших SQL-запросов будет более эффективным, чем получение больших объединенных наборов данных.

4
ответ дан 24 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: