Когда использовать хранимые процедуры вместо использования любой ORM с логикой программирования?

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


person Vishal    schedule 17.05.2010    source источник


Ответы (6)


Хранимые процедуры выполняются на стороне сервера.

Это означает, что обработка больших объемов данных не требует передачи этих данных по сетевому соединению.

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

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

Вместо того, чтобы делать это с помощью триггеров (которые реализованы с использованием неэффективного подхода «запись за записью» во многих системах), вы можете передать табличную переменную или временную таблицу с входными данными и выполнить оператор SQL на основе набора внутри процедуры. Это будет намного эффективнее.

person Quassnoi    schedule 17.05.2010
comment
+1 за отличное понимание, которое часто упускается из виду (или не упоминается). - person Justin Ethier; 17.05.2010
comment
@Joel: не все движки поддерживают табличные переменные. - person Quassnoi; 17.05.2010
comment
Я никогда не думал об использовании его поверх триггеров ... также я думаю, что одна из вещей ... наличие логики на стороне базы данных означает, что вы можете повторно использовать ее с любой другой платформой или языком ... но ваш ответ хорошо подводит итог ... - person Vishal; 17.05.2010

Я предпочитаю SP логике программирования в основном по двум причинам.

  • Performance, anything what will reduce result set or can be more effectively done on the server, e.g.:
    • paging
    • фильтрация
    • порядок (по индексированным столбцам)
  • Безопасность - если кто-то получил доступ приложения к базе данных и хочет стереть все ваши записи, необходимость выполнять Row_Delete для каждой из них вместо DELETE FROM Rows уже звучит хорошо.
person Regent    schedule 17.05.2010
comment
Пейджинг/фильтрация/упорядочивание по-прежнему будут выполняться на стороне сервера в любом стоящем OR/M. - person BlueRaja - Danny Pflughoeft; 17.05.2010

Никогда, если вы не определите проблему с производительностью. (в основном мнение)

(сообщение в блоге Джеффа!) http://www.codinghorror.com/blog/2004/10/who-needs-stored-procedures-anyways.html

Если вы видите сохраненные процессы как оптимизации: http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize

person Sprague    schedule 17.05.2010
comment
В старые времена производительность была проблемой, поэтому этот аргумент возникал. Сегодня большинство встроенных sql могут работать так же быстро, как хранимые процедуры. Несмотря на это, есть много дополнительных причин для использования procs. - person NotMe; 17.05.2010
comment
Эта тема похожа на аборты или однополые браки, вы не можете победить, когда спорите об этом. Тем не менее, я скажу, что единственный раз, когда я лично использую хранимые процессы, — это когда мой босс заставляет меня делать это против моего здравого смысла или когда есть проблемы с производительностью производства. - person Sprague; 17.05.2010
comment
Мне нравится эта цитата: хранимые процедуры следует рассматривать как язык ассемблера базы данных: для использования только в самых критических для производительности ситуациях. - person Matthew Groves; 17.05.2010
comment
Я на самом деле вставил эту цитату в комментарий, прежде чем решил не использовать ее. Определенно отличная аналогия. - person Sprague; 17.05.2010
comment
Я также должен добавить, что ORM, обрабатывающий массовые обновления, может быть громоздким - это может быть проблемой ненадолго, но это веская причина для использования хранимых процедур (пакет операторов обновления менее желателен, чем оператор update/where). Тем не менее, большинство из этих ситуаций, вероятно, могут быть обработаны администратором баз данных как единичные действия, а не в коде. - person Sprague; 15.07.2010

Когда это уместно.

  • сложная логика проверки/проверки данных
  • избегать нескольких круговых поездок для выполнения одного действия в БД
  • несколько клиентов
  • все, что должно быть установлено на основе

Нельзя говорить «никогда» или «всегда».

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

Наконец, почему я не могу инкапсулировать код в хранимую процедуру? Разве это не хорошо?

person gbn    schedule 17.05.2010

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

Здесь есть несколько точек зрения, и эти дебаты всегда вызывают сильные чувства с обеих сторон.

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

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

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

person kevinw    schedule 17.05.2010

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

person Joel Coehoorn    schedule 17.05.2010
comment
При правильном выполнении базы данных могут нормально масштабироваться (по вертикали). - person NotMe; 17.05.2010
comment
@Chris - добавить дополнительные серверы приложений гораздо проще, чем добавить дополнительные серверы баз данных, на которых размещена та же база данных. Конечно, быть таким большим — одна из тех хороших проблем, которые нужно иметь. - person Joel Coehoorn; 17.05.2010