Jeden z moich współpracowników nazwał procedurę przechowywaną w naszej bazie danych SQL Server 2008 R2 sp_something
. Kiedy to zobaczyłem, od razu pomyślałem: „To jest ŹLE!” i zacząłem przeszukiwać moje zakładki do tego artykułu online, który wyjaśnia, dlaczego jest on niepoprawny, aby móc wyjaśnić mojemu współpracownikowi.
W artykule (autorstwa Briana Morana ) wyjaśniono, że nadanie procedurze składowanej prefiksu sp_ powoduje, że SQL Server patrzy na główną bazę danych w poszukiwaniu skompilowanego planu. Ponieważ tam sp_sproc
nie ma, SQL Server ponownie skompiluje procedurę (i potrzebuje do tego wyłącznej blokady kompilacji, powodując problemy z wydajnością).
Poniższy przykład podano w artykule, aby pokazać różnicę między dwiema procedurami:
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
Uruchom to, następnie otwórz Profiler (dodaj SP:CacheMiss
zdarzenie Procedury składowane -> zdarzenie) i ponownie uruchom procedury składowane. Powinieneś zobaczyć różnicę między dwiema procedurami przechowywanymi: procedura sp_Select1
przechowywana wygeneruje jeszcze jedno SP:CacheMiss
zdarzenie niż Select1
procedura przechowywana (artykuł odwołuje się do SQL Server 7.0 i SQL Server 2000 ).
Po uruchomieniu przykładu w moim środowisku SQL Server 2008 R2 otrzymuję taką samą ilość SP:CacheMiss
zdarzeń dla obu procedur (zarówno w tempdb, jak i w innej testowej bazie danych).
Zastanawiam się więc:
- Czy mogłem zrobić coś złego, wykonując przykład?
Jest „nie nazywaj użytkownikasproc sp_something
adagium „nie nazywaj ” jest nadal aktualne w nowszych wersjach SQL Server?- Jeśli tak, to czy istnieje dobry przykład, który pokazuje jego ważność w SQL Server 2008 R2?
Wielkie dzięki za twoje przemyślenia na ten temat!
EDYTOWAĆ
Znalazłem tworzenie procedur przechowywanych ( aparat bazy danych) w msdn dla SQL Server 2008 R2, który odpowiada na moje drugie pytanie:
Zalecamy, aby nie tworzyć żadnych procedur przechowywanych, używając sp_ jako prefiksu. SQL Server używa przedrostka sp_ do oznaczenia procedur przechowywanych w systemie. Wybrana nazwa może być sprzeczna z niektórymi przyszłymi procedurami systemowymi. [...]
Nie wspomniano jednak o problemach z wydajnością spowodowanych użyciem sp_
prefiksu. Chciałbym wiedzieć, czy nadal tak jest, czy naprawili to po SQL Server 2000.
sp_
? Jest to tak samo przydatne jak prefiksowanie tabeli za pomocą tbl
. Po co stawiać system jako główny system wyszukiwania (nawet jeśli ma znikomą różnicę wydajności lub nie ma żadnej różnicy w wydajności), aby umożliwić korzystanie z tej bezsensownej konwencji nazewnictwa?
dbo.sp_Author_Rename
jest lepszy niż dbo.Author_Rename
. Nie mogę wymyślić jednej rzeczy, która ma sens.
sp_
wersji (wymaga sprawdzenia zarówno w bazach danych master, jak i bazach użytkowników, ponieważ priorytetowo traktuje systemowe procesymaster
-> procs w bazie danych użytkownika -> niesystemowe procs inmaster
)