Один з моїх колег назвав збережену процедуру в нашій базі даних SQL Server 2008 R2 sp_something
. Побачивши це, я одразу подумав: "Це НЕПРАВНО!" і почав шукати мої закладки для цієї інтернет-статті, яка пояснює, чому це неправильно, щоб я міг надати своєму колезі пояснення.
У статті ( Брайан Моран ) пояснюється, що надання збереженій процедурі префікса sp_ змушує SQL Server переглянути основну базу даних для складеного плану. Оскільки там sp_sproc
не проживає, SQL Server перекомпілює процедуру (і для цього потрібен ексклюзивний замок компіляції, що спричинить проблеми з продуктивністю).
У статті наведено наступний приклад, щоб показати різницю між двома процедурами:
USE tempdb;
GO
CREATE PROCEDURE dbo.Select1 AS SELECT 1;
GO
CREATE PROCEDURE dbo.sp_Select1 AS SELECT 1;
GO
EXEC dbo.sp_Select1;
GO
EXEC dbo.Select1;
GO
Ви запускаєте це, потім відкриваєте Профілер (додайте Збережені процедури -> SP:CacheMiss
подія) та запускайте збережені процедури заново. Ви повинні побачити різницю між двома збереженими процедурами: sp_Select1
збережена процедура генерує ще одну SP:CacheMiss
подію, ніж Select1
збережена процедура (статті посилаються на SQL Server 7.0 та SQL Server 2000. )
Коли я запускаю приклад у моєму середовищі SQL Server 2008 R2, я отримую однакову кількість SP:CacheMiss
подій для обох процедур (і в tempdb, і в іншій тестовій базі даних).
Тож мені цікаво:
- Чи можу я зробити щось не так у виконанні прикладу?
Чиsproc sp_something
адагіум "не називати користувача " все ще дійсний у нових версіях SQL Server?- Якщо так, чи є хороший приклад, який показує його дійсність у SQL Server 2008 R2?
Дякую за ваші думки з цього приводу!
EDIT
Я знайшов Створення збережених процедур (Engine Database Engine) у msdn для SQL Server 2008 R2, який відповідає на моє друге питання:
Ми рекомендуємо не створювати жодних збережених процедур, використовуючи sp_ як префікс. SQL Server використовує префікс sp_ для позначення системних збережених процедур. Ім'я, яке ви вибрали, може суперечити деякій майбутній системній процедурі. [...]
Там нічого не згадується про проблеми з продуктивністю, викликані використанням sp_
префікса. Я хотів би дізнатися, чи все ще так, чи вони виправили це після SQL Server 2000.
sp_
? Це приблизно так само корисно, як і префіксація таблиці tbl
. Навіщо спочатку змусити майстра пошуку системи (навіть якщо це незначна різниця в продуктивності або немає), щоб дозволити вам використовувати цю безглузду конвенцію іменування?
dbo.sp_Author_Rename
краще, ніж dbo.Author_Rename
. Я не можу придумати жодної речі, яка має сенс.
sp_
версій (потрібно перевірити як у базовій, так і в базі даних користувачів, оскільки це визначає пріоритет системних програм уmaster
-> програмах у користувальницькій БД -> не в системі procs inmaster
)