Uno dei miei colleghi ha chiamato una procedura memorizzata nel nostro database SQL Server 2008 R2 sp_something
. Quando ho visto questo, ho subito pensato: "È SBAGLIATO!" e ho iniziato a cercare nei miei segnalibri questo articolo online che spiega perché è sbagliato, così ho potuto fornire una spiegazione al mio collega.
Nell'articolo (di Brian Moran ) viene spiegato che assegnando alla procedura memorizzata un prefisso sp_ , SQL Server esamina il database master per un piano compilato. Poiché sp_sproc
non si trova lì, SQL Server ricompilerà la procedura (e per questo richiede un blocco di compilazione esclusivo, causando problemi di prestazioni).
Il seguente esempio è riportato nell'articolo per mostrare la differenza tra due procedure:
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
Eseguire questo, quindi aprire il Profiler (aggiungere l' SP:CacheMiss
evento Stored Procedures -> ) ed eseguire nuovamente le stored procedure. Dovresti vedere una differenza tra le due stored procedure: la sp_Select1
stored procedure genererà un SP:CacheMiss
evento in più rispetto alla Select1
stored procedure (l'articolo fa riferimento a SQL Server 7.0 e SQL Server 2000 ).
Quando eseguo l'esempio nel mio ambiente SQL Server 2008 R2, ottengo la stessa quantità di SP:CacheMiss
eventi per entrambe le procedure (sia in tempdb che in un altro database di test).
Quindi mi chiedo:
- Posso aver fatto qualcosa di sbagliato nell'esecuzione dell'esempio?
sproc sp_something
L'adagium " non nominare un utente " è ancora valido nelle versioni più recenti di SQL Server?- In tal caso, esiste un buon esempio che mostra la sua validità in SQL Server 2008 R2?
Grazie mille per i tuoi pensieri su questo!
MODIFICARE
Ho trovato Creazione di stored procedure (Motore di database) su msdn per SQL Server 2008 R2, che risponde alla mia seconda domanda:
Si consiglia di non creare alcuna procedura memorizzata utilizzando sp_ come prefisso. SQL Server utilizza il prefisso sp_ per designare le stored procedure di sistema. Il nome scelto potrebbe essere in conflitto con alcune future procedure di sistema. [...]
Non viene menzionato nulla in merito ai problemi di prestazioni causati dall'utilizzo del sp_
prefisso. Mi piacerebbe sapere se è ancora così o se lo hanno risolto dopo SQL Server 2000.
sp_
? È utile quanto il prefisso di una tabella con tbl
. Perché fare prima il master di ricerca del sistema (anche se è trascurabile o nessuna differenza di prestazioni) per consentire di utilizzare questa convenzione di denominazione insignificante?
dbo.sp_Author_Rename
è meglio di dbo.Author_Rename
. Non riesco a pensare a una sola cosa che abbia senso.
sp_
versioni (è necessario controllare sia i database master che quelli utente perché dà la priorità ai proc di sistema inmaster
-> proc in DB utente -> non di sistema procs inmaster
)