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_sprocnon 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:CacheMissevento Stored Procedures -> ) ed eseguire nuovamente le stored procedure. Dovresti vedere una differenza tra le due stored procedure: la sp_Select1stored procedure genererà un SP:CacheMissevento in più rispetto alla Select1stored 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:CacheMisseventi 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_somethingL'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)