Einer meiner Mitarbeiter hat eine gespeicherte Prozedur in unserer SQL Server 2008 R2-Datenbank benannt sp_something
. Als ich das sah, dachte ich sofort: "Das ist FALSCH!" und fing an, in meinen Lesezeichen nach diesem Online-Artikel zu suchen , der erklärt, warum er falsch ist, damit ich meinem Kollegen eine Erklärung geben konnte.
In dem Artikel (von Brian Moran ) wird erläutert, dass SQL Server die Master-Datenbank nach einem kompilierten Plan durchsucht , wenn der gespeicherten Prozedur ein sp_- Präfix zugewiesen wird. Da sich der sp_sproc
nicht dort befindet, kompiliert SQL Server die Prozedur neu (und benötigt dafür eine exklusive Kompilierungssperre, die zu Leistungsproblemen führt).
Das folgende Beispiel wird in dem Artikel angegeben, um den Unterschied zwischen zwei Prozeduren zu zeigen:
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
Sie führen dies aus, öffnen dann den Profiler (fügen Sie das SP:CacheMiss
Ereignis Gespeicherte Prozeduren -> hinzu ) und führen die gespeicherten Prozeduren erneut aus. Sie sollten einen Unterschied zwischen den beiden gespeicherten Prozeduren feststellen: Die sp_Select1
gespeicherte Prozedur generiert ein SP:CacheMiss
Ereignis mehr als die Select1
gespeicherte Prozedur (der Artikel verweist auf SQL Server 7.0 und SQL Server 2000 ).
Wenn ich das Beispiel in meiner SQL Server 2008 R2-Umgebung ausführe, erhalte ich SP:CacheMiss
für beide Prozeduren die gleiche Anzahl von Ereignissen (sowohl in tempdb als auch in einer anderen Testdatenbank).
Ich frage mich also:
- Kann ich bei der Ausführung des Beispiels etwas falsch gemacht haben?
Ist dassproc sp_something
Adagium " Benutzer nicht benennen " in neueren Versionen von SQL Server noch gültig?- Wenn ja, gibt es ein gutes Beispiel für die Gültigkeit in SQL Server 2008 R2?
Vielen Dank für Ihre Gedanken dazu!
BEARBEITEN
Ich fand Stored Procedures (Database Engine) Erstellen von auf Msdn für SQL Server 2008 R2, die meine zweite Frage beantwortet:
Es wird empfohlen, keine gespeicherten Prozeduren mit sp_ als Präfix zu erstellen. SQL Server verwendet das Präfix sp_, um gespeicherte Systemprozeduren anzugeben. Der von Ihnen gewählte Name kann zu Konflikten mit zukünftigen Systemprozeduren führen. [...]
Über Leistungsprobleme, die durch die Verwendung des sp_
Präfixes verursacht werden, wird dort jedoch nichts erwähnt . Ich würde gerne wissen, ob dies immer noch der Fall ist oder ob es nach SQL Server 2000 behoben wurde.
sp_
? Dies ist ungefähr so nützlich wie das Präfixieren einer Tabelle mit tbl
. Warum sollte der Systemsuchmaster zuerst eingerichtet werden (auch wenn es sich um einen vernachlässigbaren oder keinen Leistungsunterschied handelt), damit Sie diese bedeutungslose Namenskonvention verwenden können?
dbo.sp_Author_Rename
das besser ist als dbo.Author_Rename
. Mir fällt nichts ein, was Sinn macht.
sp_
Versionen zurückzuführen ist (muss sowohl in der Master- als auch in der Benutzerdatenbank eingecheckt werden, da System-Procs inmaster
-> Procs in der Benutzer-DB -> non system Vorrang haben) procs inmaster
)