Ефективність збережених процедур проти необроблених запитів


23

Я багато читав з обох сторін цієї дискусії: чи є значне збільшення продуктивності, використовуючи лише збережені процедури над необробленими запитами? Мене спеціально цікавить SQL Server, але мені цікаво будь-яка база даних.


2
Чи можете ви розмістити посилання на щось прочитане? Я не думаю, що продуктивність тут під загрозою (принаймні не безпосередньо)
Джек Дуглас

1
@JackDouglas, перевіри відповідь mrdenny. Виконання - це дуже важлива частина цього питання / відповіді.
Thomas Stringer

Відповіді:


31

Це менше, ніж у SQL Server 2008 і вище, але він все ще є. Це зводиться до того, що кеш плану виконання та SQL Server можуть автоматично параметризувати запити, які надсилаються. При використанні збережених процедур (у яких немає динамічного SQL всередині них) запити вже параметризовані, тому SQL Server не робить ' не потрібно генерувати план для кожного запиту під час його запуску, оскільки плани вже зберігаються в кеші плану.

І не забувайте про проблеми безпеки (динамічний SQL, мінімальні дозволи та ін.), Які усуваються під час використання збережених процедур.

Коли додаток використовує динамічний SQL проти базових таблиць для вибору, вставлення, оновлення та видалення даних у таблицях, програма повинна мати права на всі ці об’єкти безпосередньо. Тож якщо хтось використовує SQL Injection, щоб потрапити на сервер, він матиме права запитувати, змінювати або видаляти всі дані в цих таблицях.

Якщо ви використовуєте збережені процедури, вони мають лише право виконувати збережені процедури, отримуючи назад лише ту інформацію, яку зберігає процедура. Замість того, щоб видавати оперативу швидкого видалення та видаляти все, їм потрібно було б розібратися, які процедури можна використовувати для видалення даних, а потім з'ясувати, як використовувати процедуру для цього.

З огляду на те, що SQL Injection - це найпростіший спосіб проникнення в базу даних, це дуже важливо.


@mrdenny - чи можна отримати такий же ефект із "необробленими запитами", якщо вони параметризовані?
Джек Дуглас

Так, якщо вони повністю налаштовані. Однак це не стосується проблем безпеки, які вирішуються збереженими процедурами.
mrdenny

10

Як доповнення до відповіді Денні, не рідкість знаходити системи, де значна пам'ять буферного пусту витрачається на спеціальні плани виконання одноразового або низького використання, створені в результаті запитів, що використовуються в документах.

Найгірші випадки останнім часом, 8 ГБ, виділених на екземпляр, 3 ГБ кеш-плану, 2,5 ГБ одноразового використання. Більшість з них були SQL2005, тому не було можливості спробувати оптимізувати налаштування спеціальних робочих навантажень.

Звичайно, важче включити продуктивність у виправдання процедур над необробленими запитами. Один з найсильніших аргументів для мене зараз - "Якщо ви використовуєте процедури, мені набагато простіше допомогти, коли виникають проблеми з продуктивністю". Динамічний / linq / orm інтерфейс не заважає вам налаштувати, але він може серйозно обмежити ваші можливості.


Тут є чудова пов’язана стаття, включаючи сценарії для видалення цих планів одноразового використання. sqlskills.com/blogs/kimberly/…
SomeGuy

7

SQL Server кешує та оптимізує збережені процедури та спеціальний SQL таким же чином. Наприклад, ця процедура:

create procedure dbo.TestSB(@id int) as select * from Orders where id = @id

Буде оптимізовано та кешовано ідентично:

select * from Orders where id = @id

Однак наступний спеціальний SQL не може бути кешований ефективно з-за твердо кодованого значення:

select * from Orders where id = 42

Хоча ефективність однакова, є вагомі причини використовувати збережені процедури. Збережені процедури забезпечують чіткий поділ між DBA і розробниками додатків. Добре мати додатковий рівень захисту між вашими цінними даними та програмами, що постійно змінюються :)


+1, особливо якщо ви змусили весь доступ пройти ваші SP, і вони добре продумані як транзакційний API, а не лише шар CRUD
Джек Дуглас

У 2008+ id = 42запит можна оптимізувати, використовуючи той самий план залежно від простих / примусових параметрів параметризації. Звичайно, запити повинні бути правильно налаштовані. :-)
Аарон Бертран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.