私の同僚の1人が、SQL Server 2008 R2データベースのストアドプロシージャに名前を付けましたsp_something
。これを見たとき、私はすぐに考えました:「それは間違っている!」なぜ間違っているのかを説明するこのオンライン記事のブックマークを検索し始めたので、同僚に説明を提供することができました。
(Brian Moranによる)記事では、ストアドプロシージャにsp_プレフィックスを付けると、SQL Serverがコンパイル済みプランのマスターデータベースを参照することが説明されています。sp_sproc
が存在しないため、SQL Serverはプロシージャを再コンパイルします(そのためには排他的なコンパイルロックが必要で、パフォーマンスの問題が発生します)。
次の例は、2つの手順の違いを示すために記事に記載されています。
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
これを実行してから、プロファイラーを開き(ストアドプロシージャ-> SP:CacheMiss
イベントを追加)、ストアドプロシージャを再度実行します。2つのストアドプロシージャには違いがあるはずです。sp_Select1
ストアドプロシージャはSP:CacheMiss
、Select1
ストアドプロシージャよりも1つ多くのイベントを生成します(この記事では、SQL Server 7.0とSQL Server 2000を参照しています)。
SQL Server 2008 R2環境で例を実行すると、SP:CacheMiss
両方の手順(tempdbと別のテストデータベースの両方)で同じ量のイベントが発生します。
だから私は疑問に思っています:
- 例の実行で何か間違ったことをしたことはありますか?
'ユーザーに名前を付けないsproc sp_something
' adagiumは、SQL Serverの新しいバージョンでもまだ有効ですか?- その場合、SQL Server 2008 R2での有効性を示す良い例はありますか?
これについてのあなたの考えをどうもありがとう!
編集
2番目の質問に答えるSQL Server 2008 R2のmsdnでストアドプロシージャ(データベースエンジン)の作成を見つけました。
プレフィックスとしてsp_を使用するストアドプロシージャを作成しないことをお勧めします。SQL Serverはsp_プレフィックスを使用して、システムストアドプロシージャを指定します。選択した名前は、将来のシステム手順と競合する可能性があります。[...]
ただし、プレフィックスを使用したことによるパフォーマンスの問題については何も言及されていませんsp_
。SQL Server 2000以降に問題が解決したのか、それとも修正されたのかを知りたい。
sp_
か?これは、テーブルにプレフィックスを付けるのと同じくらい便利ですtbl
。この意味のない命名規則を使用できるようにするために、システム検索マスターを最初に(パフォーマンスにわずかな違いがある場合でもパフォーマンスの違いがない場合でも)最初にするのはなぜですか?
dbo.sp_Author_Rename
がより良いかを説明してもらいますdbo.Author_Rename
。理にかなった単一のことを考えることはできません。
sp_
バージョンを解決するオーバーヘッドをわずかに大きくしました(マスターデータベースとユーザーデータベースの両方でチェックする必要がありますmaster
- システムのプロシージャを優先するため->ユーザーDBのプロシージャ->非システムprocs inmaster
)