Головна проблема в тому, що використання префікса 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, але компіляції виконується в кожній конкретній базі даних.Увійти за допомогою:
Немає майбутніх заходи в зазначений період часу.