Хоча я поважаю представника, я смиренно не згоден з наданою відповіддю, а не з "релігійних причин". Іншими словами, я вважаю, що Microsoft не створила жодної можливості, яка б зменшила потребу в керівництві щодо використання збережених процедур.
Будь-які вказівки, що надаються розробнику, що сприяє використанню необроблених текстових запитів SQL, повинні бути заповнені багатьма застереженнями, так що, на мою думку, найдоцільнішою порадою є велике заохочення до використання збережених процедур та відмовляти ваші команди розробників від участі в практиці вбудовування операторів SQL в код або подання необроблених, звичайних текстових запитів на основі SQL за межами SQL SPROC (збережені процедури).
Я думаю, що відповідь на питання про те, навіщо використовувати SPROC, є таким, як подав заявник: SPROC розбираються, оптимізуються та компілюються. Таким чином, плани їх запиту / виконання кешуються, тому що ви зберегли статичне подання запиту, і ви, як правило, будете змінювати його лише за параметрами, що не відповідає дійсності у випадку скопійованих / вставлених SQL-операторів, які ймовірно перетворюються від сторінки до сторінки та компонента / ярусу, і вони часто варіабелізовані настільки, що різні таблиці, навіть імена бази даних, можуть бути визначені від дзвінка до дзвінка. Дозволено для цього типу динамічних спеціальних заходівПредставлення SQL значно знижує ймовірність того, що Двигун БД повторно використовувати план запитів для ваших спеціальних висловлювань відповідно до деяких дуже суворих правил. Тут я розрізняю динамічні спеціальні запити (в дусі порушеного питання) проти використання ефективної системи SPROC sp_executesql.
Більш конкретно, є такі компоненти:
- Послідовні та паралельні плани запитів, які не містять контексту користувача та дозволяють повторно використовувати двигуном БД.
- Контекст виконання, який дозволяє повторно використовувати план запитів новим користувачем з різними параметрами даних.
- Кеш процедури, який запитує двигун БД, щоб створити працездатність.
Коли оператор SQL видається з веб-сторінки, який називається "ad hoc заявою", двигун шукає існуючий план виконання для обробки запиту. Оскільки це текст, представлений користувачем, він буде прийнятий, проаналізований, складений та виконаний, якщо він дійсний. Цього разу він отримає нульову вартість запиту. Вартість запиту використовується, коли двигун БД використовує свій алгоритм, щоб визначити, які плани планується вилучити з кешу.
За замовчуванням спеціальні запити отримують початкове значення вартості запиту, яке дорівнює нулю. Після подальшого виконання такого ж тексту спеціального запиту іншим користувацьким процесом (або тим самим) поточна вартість запиту скидається до початкової вартості компіляції. Оскільки вартість компіляції спеціального запиту дорівнює нулю, це не означає, що можливість повторного використання. Очевидно, що нуль - це найменше ціле число, але навіщо його виселяти?
Коли тиски в пам'яті виникають і вони будуть, якщо у вас часто використовується сайт, двигун БД використовує алгоритм очищення, щоб визначити, як він може відновити пам'ять, яку використовує кеш процедури. Він використовує поточну вартість запиту, щоб вирішити, які плани виселити. Як ви здогадуєтесь, плани із вартістю нуля першими вилучаються з кешу, оскільки нуль по суті означає "немає поточних користувачів або посилань на цей план".
- Примітка: Спеціальні плани виконання - Поточна вартість збільшується з кожним користувальницьким процесом на початкову вартість складання плану. Однак максимальна вартість плану не може бути більшою, ніж його початкова вартість компіляції ... у випадку спеціальних запитів ... нуль. Отже, він буде "збільшений" на цю величину ... нуль - що по суті означає, що він залишиться планом з найнижчою вартістю.
Тому цілком ймовірно, що такий план спочатку буде усунутий, коли виникне тиск в пам'яті.
Отже, якщо у вас є розробка сервера з великою кількістю пам’яті «поза вашими потребами», ви можете не відчувати цю проблему так часто, як зайнятий сервер, який має лише «достатню» пам’ять для управління навантаженням. (Вибачте, ємність та використання пам'яті сервера дещо суб'єктивні / відносні, хоча алгоритм цього немає.)
Тепер, якщо я фактично помиляюся щодо одного або декількох моментів, я, безумовно, готовий до виправлення.
Нарешті, автор написав:
"Зараз у нас є оптимізація рівня висловлювань, тож правильно параметризований запит, що надходить із програми, може скористатися тим самим планом виконання, що і цей запит, вбудований у збережену процедуру."
Я вважаю, що автор посилається на опцію "оптимізувати для спеціальних навантажень".
Якщо це так, ця опція дозволяє здійснити двоетапний процес, що дозволяє уникнути негайного надсилання повного плану запитів у кеш процедури. Він надсилає туди лише меншу заглушку запиту. Якщо точний виклик запиту буде відправлений назад на сервер, поки заглушка запиту все ще знаходиться в кеш-процедурі, то повний план виконання запиту зберігається в кеш-процедурі. Це економить на пам'яті, яка під час інцидентів тиску в пам'яті може дозволяти алгоритму виселення виселяти вашу заглушку рідше, ніж більш великий план запитів, який був кешований. Знову ж таки, це залежить від пам’яті та використання вашого сервера.
Однак цю опцію потрібно ввімкнути, оскільки вона за замовчуванням відключена.
Нарешті, я хочу наголосити, що часто саме причина розробників вбудовує SQL у сторінки, компоненти та інші місця - це тому, що вони хочуть бути гнучкими та надсилати динамічний запит SQL до двигуна бази даних. Отже, у реальному випадку використання, подання того самого тексту, переклик над дзвінками, навряд чи відбудеться, як і кешування / ефективність, до якої ми прагнемо, під час подання спеціальних запитів на SQL Server.
Для отримання додаткової інформації дивіться:
https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx
http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql
Найкраще,
Генрі