Um dos meus colegas de trabalho nomeou um procedimento armazenado em nosso banco de dados SQL Server 2008 R2 sp_something
. Quando vi isso, pensei imediatamente: "Está errado!" e comecei a pesquisar nos meus favoritos este artigo on-line que explica por que está errado, para que eu pudesse fornecer uma explicação ao meu colega de trabalho.
No artigo (de Brian Moran ), é explicado que atribuir ao procedimento armazenado um prefixo sp_ faz com que o SQL Server procure no banco de dados mestre um plano compilado. Como o sp_sproc
arquivo não reside lá, o SQL Server recompilará o procedimento (e precisará de um bloqueio de compilação exclusivo para isso, causando problemas de desempenho).
O exemplo a seguir é fornecido no artigo para mostrar a diferença entre dois procedimentos:
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
Você executa isso, abra o Profiler (adicione o SP:CacheMiss
evento Stored Procedures -> ) e execute os procedimentos armazenados novamente. Você deve ver uma diferença entre os dois procedimentos armazenados: o sp_Select1
procedimento armazenado gerará mais um SP:CacheMiss
evento que o Select1
procedimento armazenado (o artigo faz referência ao SQL Server 7.0 e SQL Server 2000 ).
Quando executo o exemplo no meu ambiente do SQL Server 2008 R2, recebo a mesma quantidade de SP:CacheMiss
eventos para os dois procedimentos (no tempdb e em outro banco de dados de teste).
Então, eu estou pensando:
- Posso ter feito algo errado na execução do exemplo?
Osproc sp_something
adágio ' não nomear um usuário ' ainda é válido nas versões mais recentes do SQL Server?- Em caso afirmativo, existe um bom exemplo que mostra sua validade no SQL Server 2008 R2?
Muito obrigado por seus pensamentos sobre isso!
EDITAR
Encontrei Criando procedimentos armazenados (mecanismo de banco de dados) no msdn para SQL Server 2008 R2, que responde minha segunda pergunta:
Recomendamos que você não crie procedimentos armazenados usando sp_ como prefixo. O SQL Server usa o prefixo sp_ para designar procedimentos armazenados do sistema. O nome escolhido pode entrar em conflito com algum procedimento futuro do sistema. [...]
Nada é mencionado lá sobre problemas de desempenho causados pelo uso do sp_
prefixo. Gostaria de saber se esse ainda é o caso ou se eles o corrigiram após o SQL Server 2000.
sp_
? Isso é tão útil quanto prefixar uma tabela com tbl
. Por que tornar a pesquisa do sistema principal primeiro (mesmo que seja insignificante ou sem diferença de desempenho) para permitir que você use essa convenção de nomenclatura sem sentido?
dbo.sp_Author_Rename
é melhor que dbo.Author_Rename
. Não consigo pensar em nada que faça sentido.
sp_
versões (precisa verificar os bancos de dados mestre e de usuário porque prioriza os procs do sistema emmaster
-> procs no usuário DB -> não sistema procs inmaster
)