2017-03-09 10 views
2

私はPetaPocoデータアクセスレイヤを使用しています。すべての値
を渡しながら、ストアドプロシージャを呼び出すとき
は、だから私は、SQLプロファイラで異なるパラメータタイプのストアドプロシージャクエリプラン

exec sp_executesql N'EXEC dbo.[sp_GetProducts] @0 , @1',N'@0 int,@1 int',@0=316,@1=5 

が、NULLタイプを渡すと、正常に動作どのようなデータ型はnvarchar(4000)のデフォルト値を決定し、それされていないが、これを取得します

exec sp_executesql N'EXEC dbo.[sp_GetProducts] @0 , @1',N'@0 int,@1 nvarchar(4000)',@0=316,NULL 

パフォーマンスに関する私の質問は、同じストアドプロシージャに2つのクエリプランがあるためパフォーマンスが低下していますか?両方のコールに同じプランが使用されていますか?

ありがとうございました

答えて

1

はい、パフォーマンスの差が生じる可能性があります。別のパラメータセットを渡すので、同じプランを使用することはできません。これはParameter Sniffingという概念に関連しています。

SQLクエリは、SQL Serverが 「スニッフィングパラメータ」と呼ばれるプロセスを経て、パフォーマンスを改善するためにそれらに合わせた実行計画 を作成したパラメータを、持っている場合。このプランは、通常はベストプラクティスプランである であるため、格納され再利用されます。ただ、時折、それはない、とあなた 、私は提供されたリンクで強調表示されているこの問題に対処する方法はいくつかあります

パフォーマンスの問題を打つことができます。 パラメータスニッフィングを扱う方法を参照してください。可能性のあるオプションは、ストアドプロシージャでWith Recompileオプションを使用するか、ストアドプロシージャ内でパラメータ値を使用する方法を変更するか、複数のストアドプロシージャを作成してパラメータスニッフィングを無効にすることです。

関連する問題