Збережені процедури з префіксом sp_ і продуктивність

Збережені процедури з префіксом sp_ і продуктивність
Існує безліч думок щодо використання / невикористання префікса sp_ для збережених процедур. На користь невикористання зазвичай наводять аргумент, що sp_ це префікс для системних збережених процедур і може виникнути плутанина. А на користь використання, що плутанина не виникне, тому що які можуть бути системні збережені процедури в призначеній для користувача базі даних. Помилка та перших, і других в тому, що використання / невикористання sp_, це не питання стилю іменування. Це питання продуктивності.
Головна проблема в тому, що використання префікса sp_ в базах відмінних від master призводить до наступної проблеми. Якщо оптимізатор зустрічає збережену процедуру з префіксом sp_ від спочатку перевіряє, а чи немає такої системної, і якщо її знаходить, то ігнорує вашу, а бере системну. Це призводить до двох проблем:

  • Зайва перевірка вимагає додаткових витрат
  • Існує досить велика ймовірність, що ваша план для такої збереженої процедури не буде кешуватися.

Розглянемо більш докладно:

Типи системних об'єктів

Системні об'єкти поставлятися з установкою SQL Server, розташовуються в системних базах даних, але можуть бути доступні з будь-яких баз даних. У поточних версіях все системні обиекти позначені як поставляються Microsoft, але в майбутніх версіях все може змінитися.
Їх всього 4:

метод розпізнавання

І так, чому потрібен спеціальний метод розпізнавання.

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

Варто також згадати, що повне ім'я об'єкта бази даних складається з 4-х частин:

Але у кожного правила є винятки, тому що Не добре змушувати писати користувача master.dbo.sp_who, а не просто sp_who.

Для розпізнання системних об'єктів використовуються наступні правила.

Anydb.dbo.sp_ * розпізнається, як master.dbo.sp_, але виконується в контексті anydb.

Тобто, якщо ми виконаємо наступний код:

Msg 195, Level 15, State 10, Line 1

'My_fn' is not a recognized built-in function name.
  • Системні уявлення з INFORMATION_SCHEMA або sys потрібно викликати із зазначенням схеми.

    При цьому вони розміщуються в базі даних master, але компіляції виконується в кожній конкретній базі даних.
  • На всі інші системні об'єкти, що поставляються компанією Microsoft, поширюються звичайні правила розпізнавання імен.
  • Увійти за допомогою:

    Немає майбутніх заходи в зазначений період часу.

    Події (англ)

    Збережені процедури з префіксом sp_ і продуктивність

    Схожі статті