Один з моїх колег назвав збережену процедуру в нашій базі даних 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)