Мое эмпирическое правило (как только я понял, что это было, подумав о вопросе), заключается в том, что хранимые процедуры должны содержать код, который обеспечивает целостность данных в базе данных, независимо от того, запрещает ли хранимая процедура определенную вставку, удаление или изменение данных, или делает другие изменения, необходимые для согласованности данных. Бизнес-логика, особенно логика, которая не может быть реализована в нескольких операциях на основе множеств, должна быть реализована в другом месте. Базы данных не являются приложениями. Базы данных должны быть окончательным авторитетом для отношений и ограничений, даже если бизнес-правила также реализованы где-то еще, например, для обеспечения обратной связи в коде пользовательского интерфейса, который уменьшает обратные передачи с веб-сервера или устраняет ненужные попадания на занятый сервер. Можно спорить о том, включает ли «согласованность данных» результат сложной обработки сложных бизнес-правил, но я думаю, что обычно это становится понятным после понимания контекста. Не все бизнес-правила реализованы в виде отношений или ограничений данных. Не все операции в хранимой процедуре выполняются быстрее, чем код, выполняемый в отдельном процессе, даже в процессе, запущенном на отдельной машине в сети. Недавно я провел демонстрацию, показывающую, что многие операции в SSIS, например, (INSERT INTO () SELECT FROM), выполняются быстрее в SSIS, работающем по сети на отдельном компьютере, чем в хранимой процедуре (которая также вставляет результаты в базу данных). через сеть). Это почти невероятный результат (где SSIS работает быстрее, чем необработанные операторы SQL), и демонстрирует, что обнаружение наилучшей оптимизации любых проблем производительности происходит из реальности (тестирование), а не из логики, основанной только на нескольких концепциях. (Мы все еще должны принять решение о том, что тестировать, исходя из практического опыта.) (SSIS быстрее выполнялся за счет автоматической реализации многопоточности и конвейеров, использования BULK INSERT даже там, где это не было указано в необработанном операторе SQL, и отправки пакетов вставок в одном потоке при создании дополнительных BULK INSERT в других потоках. В этом случае он выполнялся примерно в два раза быстрее, чем необработанные операторы SQL. Драйверы обеспечивают самый быстрый доступ к данным, «прожженный на их языке», и хотя это может быть оправдано дополнительными (непризнанными ими) объяснениями, за этим стоит заблуждение.