Un de mes collègues a nommé une procédure stockée dans notre base de données SQL Server 2008 R2 sp_something
. Quand j'ai vu cela, j'ai immédiatement pensé: "C'est FAUX!" et a commencé à chercher dans mes signets cet article en ligne qui explique pourquoi il est faux, afin que je puisse fournir une explication à mon collègue.
Dans l'article (de Brian Moran ), il est expliqué que, si un préfixe sp_ est attribué à la procédure stockée, SQL Server recherche dans la base de données master un plan compilé. sp_sproc
SQL Server recompilera la procédure ( car elle n’y réside pas) (et nécessite un verrou de compilation exclusif pour cela, ce qui entraîne des problèmes de performances).
L'exemple suivant est donné dans l'article pour montrer la différence entre deux procédures:
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
Vous exécutez cette opération, puis ouvrez le profileur (ajoutez l' SP:CacheMiss
événement Procédures stockées -> ) et exécutez à nouveau les procédures stockées. Vous êtes censé voir une différence entre les deux procédures stockées: la sp_Select1
procédure stockée générera un SP:CacheMiss
événement de plus que la Select1
procédure stockée (l'article fait référence à SQL Server 7.0 et SQL Server 2000 ).
Lorsque j'exécute l'exemple dans mon environnement SQL Server 2008 R2, j'obtiens le même nombre d' SP:CacheMiss
événements pour les deux procédures (à la fois dans tempdb et dans une autre base de données de test).
Alors je me demande:
- Puis-je avoir fait quelque chose de mal dans l'exécution de l'exemple?
L'sproc sp_something
adagium " ne nommez-vous pas un utilisateur " est-il toujours valable dans les versions les plus récentes de SQL Server?- Si tel est le cas, existe-t-il un bon exemple montrant sa validité dans SQL Server 2008 R2?
Merci beaucoup pour vos réflexions à ce sujet!
MODIFIER
J'ai trouvé la création de procédures stockées (moteur de base de données) sur msdn pour SQL Server 2008 R2, ce qui répond à ma deuxième question:
Nous vous recommandons de ne créer aucune procédure stockée utilisant sp_ comme préfixe. SQL Server utilise le préfixe sp_ pour désigner les procédures stockées du système. Le nom que vous choisissez peut entrer en conflit avec une procédure système future. [...]
Rien n’y est fait mention des problèmes de performances causés par l’utilisation du sp_
préfixe. J'aimerais savoir si c'est toujours le cas ou s'ils l'ont corrigé après SQL Server 2000.
sp_
? C'est à peu près aussi utile que de préfixer une table avec tbl
. Pourquoi faire d'abord de la recherche système (même si la différence de performances est négligeable ou nulle) pour vous permettre d'utiliser cette convention de dénomination sans signification?
dbo.sp_Author_Rename
est mieux que dbo.Author_Rename
. Je ne peux pas penser à une seule chose qui a du sens.
sp_
versions légèrement supérieur (il faut archiver les bases de données maître et utilisateur, car il priorise les processus système dansmaster
-> procs dans la base de données utilisateur -> non système Procs dansmaster
)