Возможно, имеет смысл перевернуть вопрос и найти примеры использования, в которых могут делать только хранимые процедуры, чего вы хотите достичь. Возможно, есть действительно случаи использования, где хранимые процедуры выделяются.
Если это имеет значение, я использую MSSQL и Entity Framework.
Мои знания по EF ограничены, но, насколько я понимаю, EF ( просто ) ORM, как и любой другой; и, к счастью , способен использовать сырой SQL .
Если я возьму ваши два основных пункта:
Сложный отчет, который занимал минуты, чтобы запустить (это была страница в веб-приложении). Я обнаружил, что могу написать SQL, который намного эффективнее (занимает всего несколько секунд), чем то, что предоставлял LINQ.
LINQ / EF терпел неудачу, когда делал отчет. И, как вы заметили, это было SQL
намного быстрее, чем использование ORM. Но говорит ли это в пользу хранимых процедур или только против использования ORM для всего?
Ваша проблема, очевидно, может быть решена с помощью SQL . Если этот запрос был сохранен и версия, управляемая в вашей кодовой базе, делает - согласно вашему примеру - по крайней мере никакой разницы .
Веб-приложение должно было считывать и записывать в несколько таблиц в отдельной базе данных, которая содержала много другой, конфиденциальной информации, не относящейся к приложению. Вместо того, чтобы дать ему доступ ко всему, я использовал хранимую процедуру, которая делает только то, что нужно, и возвращает только ограниченную информацию. Веб-приложение может затем получить доступ только к этой хранимой процедуре, без доступа к каким-либо таблицам и т. Д.
То же самое и здесь: простая строка подключения и и ОБНОВЛЕНИЕ, и ваша проблема решена. Эта проблема может быть решена даже с помощью ORM :
просто используйте веб-сервис перед другой БД, и такая же сравнительная / изоляция будет достигнута.
Так что нечего здесь видеть.
Глядя на некоторые моменты, которые сделали другие:
У вас есть сложные единицы работы, возможно, включающие много таблиц, которые нельзя легко обернуть в транзакцию, используя функции EF.
Но SQL
могу это сделать. Здесь нет магии .
Ваша база данных не очень хорошо работает с EF
Опять же: используйте EF, когда это необходимо.
Вам нужно работать с данными, которые пересекают границы серверов со связанными серверами
Я не вижу, как помогают хранимые процедуры. Поэтому я не вижу преимущества хранимых процедур; но, возможно, кто-то проливает свет на это.
У вас есть очень сложные сценарии извлечения данных, где необходим «чистый металл» SQL для обеспечения адекватной производительности
Опять же: «Границы ЭФ ».
Ваше приложение не имеет полных разрешений CRUD для таблицы, но вашему приложению может быть разрешено работать в контексте безопасности, которому доверяет ваш сервер
Ладно. Я иду с возможно .
Пока что только половина пункта была сделана в пользу хранимых процедур.
Возможно, есть соображения производительности, которые говорят в пользу хранимых процедур.
1) Хранение запросов имеет преимущество простого вызова хранимой процедуры, которая инкапсулирует сложность. Поскольку планировщик запросов знает запрос, его «легче» оптимизировать. Но сохранений с текущим сложным планировщик запросов _minimal.
Вдобавок ко всему , даже если использование специальных запросов сопряжено с небольшими затратами , если ваши данные хорошо структурированы и тщательно проиндексированы, база данных является лишь узким местом вашего приложения. Так что, даже если есть небольшая дельта, это пренебрежимо, учитывая другие факторы.
2) Тем не менее, он утверждался для хранения сложных запросов в БД. Есть две вещи для рассмотрения:
а) сложные запросы широко используют инфраструктуру БД, что увеличивает время отклика для каждого другого запроса. Вы не можете выполнять много дорогостоящих запросов параллельно . Это не говорит ни за, ни против хранимых процедур, но против сложных запросов.
б) Если запрос в любом случае занимает время, зачем беспокоиться о небольшой скорости выигрыша хранимой процедуры.
ТЛ; др
Ничто не говорит прямо против хранимых процедур. Так что использование хранимых процедур - это нормально, если это вас радует.
Но с другой стороны: я не мог представить себе подходящий вариант использования, который бы однозначно говорил про.
Когда я должен использовать хранимые процедуры?
Правильный ответ: когда захочешь . Но есть и другие варианты.