Можливо, є сенс розгорнути питання і знайти шафи використання, де можна було б лише збережені процедури, чого ви хочете досягти. Можливо, є справді випадки використання, коли зберігаються процедури виділяються.
Якщо це має значення, я використовую MSSQL та Entity Framework.
Мої знання з EF є обмеженими, але, наскільки я бачу, EF є ( просто ) ORM, як і будь-який інший; і на щастя здатний використовувати необроблений SQL .
Якщо я візьму ваші два основні моменти:
Складний звіт, який запускав кілька хвилин (це була сторінка у веб-додатку). Я виявив, що можу написати SQL, який був набагато ефективнішим (запускаючи лише секунди), ніж те, що LINQ надав.
Під час складання звіту LINQ / EF не вистачало. І як ви помітили, це було SQL
набагато швидше, ніж використання ORM. Але чи говорить це на користь збережених процедур або лише проти використання ORM для всього?
Ваша проблема, очевидно, може бути вирішена за допомогою SQL . Якщо цей запит був збережений і версія, контрольована у вашій кодовій базі, не відповідає - відповідно до вашого прикладу - принаймні різниці .
Веб-додаток, необхідний для читання та запису до кількох таблиць окремої бази даних, що містив безліч іншої, конфіденційної інформації, яка не стосується програми. Замість того, щоб надати їй доступ до всього, я використав збережену процедуру, яка виконує лише те, що потрібно, і повертає лише обмежену інформацію. Потім веб-додаток може отримати доступ лише до цієї збереженої процедури, без доступу до таблиць тощо.
Тут те ж саме: простий рядок з'єднання, і UPDATE і ваша проблема. Цю проблему можна вирішити навіть за допомогою ORM :
просто скористайтеся веб-сервісом напроти інших БД, і буде досягнута така ж компартементалізація / ізоляція .
Тож тут нічого не бачити.
Дивлячись на деякі моменти:
У вас є складні одиниці роботи, можливо, що включають багато таблиць, які неможливо легко зафіксувати в транзакції, використовуючи функції EF.
Але SQL
може це зробити. Тут немає жодної магії .
Ваша база даних не грає добре з EF
Знову ж таки: використовуйте EF, коли це доречно
Вам потрібно працювати з даними, які перетинають межі сервера з пов'язаними серверами
Я не бачу, як допомагають збережені процедури. Тому я не бачу переваги збережених процедур; але, можливо, хтось проливає на це трохи світла.
У вас дуже складні сценарії пошуку даних, де SQL для "голого металу" потрібен для забезпечення достатньої продуктивності
Знову ж таки: "Межі EF ".
У вашій програмі немає повних дозволів CRUD на столі, але вашій програмі можна дозволити запускатись у контексті безпеки, якому довіряє ваш сервер.
Добре. Я йду з можливо .
Поки що лише половина балів була зроблена на користь збережених процедур.
Можливо, є міркування щодо ефективності, які говорять на користь збережених процедур.
1) Зберігання запитів має перевагу від простого виклику до збереженої процедури, що інкапсулює складність. Оскільки планувальник запитів знає запит, оптимізувати його "простіше". Але заощадження виконуються за допомогою поточного складного планувальника запитів _minimal.
Крім того, навіть якщо є невелика вартість використання спеціальних запитів, якщо ваші дані добре структуровані та ретельно індексовані, база даних є лише вузьким місцем вашої програми. Тож навіть якщо є невелика дельта, це нехтувати врахуванням інших факторів.
2) Тим не менш, це було аргументовано для зберігання складних запитів у БД. Слід розглянути дві речі:
а) складні запити масово використовують інфраструктуру БД, що збільшує час отримання нових запитів. Не можна паралельно запускати багато дорогих запитів . Це не говорить ні про, ні протипоказані процедури, але проти складних запитів.
б) Якщо запит у будь-який час займає час, чому б турбуватися з невеликою швидкістю, виграє збережена процедура.
тл; д-р
Ніщо не говорить прямо проти збережених процедур. Тому використовувати збережені процедури нормально - якщо це робить вас щасливими.
Але з іншого боку: я не міг уявити собі належний випадок використання, який однозначно говорить про.
Коли я повинен використовувати збережені процедури?
Правильна відповідь: Коли завгодно . Але є й інші варіанти.