0

次のようなストアド プロシージャがあります。

create proc wsp_test
(
    @age           int
    , @userName    varchar(30)
)
as
    select    userID, userName
    from      Users
    where     userName  like '%' + @userName + '%'
    and       age > @age

C# コードは次のとおりです。

ケース 1:

SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age", SqlDbType.Int, 4);
_cmd.Parameters.Add("UserName", SqlDbType.VarChar, 30);

ケース 2:

SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age", SqlDbType.Int);
_cmd.Parameters.Add("UserName", SqlDbType.VarChar);

ケース 3:

SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age");
_cmd.Parameters.Add("UserName");

ケース 4:

SqlCommand _cmd = new SqlCommand();
_cmd.CommandText = "EXEC wsp_test 20, 'John'";

ここで私の質問は、パラメーターのデータ型または長さを指定することは、パフォーマンスとどのような関係があるのでしょうか?

どれが最高のパフォーマンスを持っていますか? 信頼できる Microsoft の Web サイトのドキュメントはありますか?

または、パラメーターのデータ型と長さを指定するセキュリティ上の理由はありますか?

4

2 に答える 2

1

これと比較すると、データ型のパフォーマンスはまったく関係ありません。

where     userName  like '%' + @userName + '%'

クエリのこの特定の部分は、パラメーターを処理するよりも指数関数的に時間がかかります。

この段階ではパフォーマンスを気にしないことをお勧めします。早すぎ。確かに、パラメーターの型と長さを指定するかどうかのマイクロベンチマークではありません。他の要因を見てください。はい、タイプを指定する必要があります。これにより、コードがより保守しやすくなり、実行時のキャストの問題を特定して解決しやすくなります。

後でこの特定のコードがアプリケーションのボトルネックであると判断した場合は、ユーザー名フィールドに全文を使用することを検討してください。このコードの使用状況の統計を見て、本当に必要かどうかを判断することもできます。クエリの大部分は、ユーザー名と完全に一致していますか、または少なくとも最初から一致していますか? 完全一致を最初に検索する方がはるかに高速で、完全一致が見つからない場合は部分一致のみを検索するのがユース ケースに適していますか?

于 2013-04-05T02:07:00.440 に答える
0

明確にするために、あなたの意図を明確かつ間違いなく伝えるために、私は使用します

ケース 5 :

SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age", SqlDbType.Int);
_cmd.Parameters.Add("UserName", SqlDbType.VarChar, 30);

の場合SqlDbType.Int、サイズを指定する必要はなく、意味もありません。サイズは常に4 バイトであり、変更も調整もできません。

の場合、このパラメーターに何を入れSqlDbType.VarCharたいかを明確にするために、常に長さを指定します。おそらく絶対に必要というわけではありませんが、私はそのようなことについて非常に明確にするのが好きです.

パフォーマンスの観点からは、ケース 1 ~ 3 は同等 (ギブ オア テイク) になると思いますが、ケース #4 は少し怪しいようで、実行しているかどうかはわかりません。このようにすると、パフォーマンスに (マイナスの) 影響があります。そもそもこの方法は絶対にやらないでしょう(不明確です。何をしているのかが明らかではありません。値を渡すためにパラメーターを使用していません-ただ面倒です!)

于 2013-04-05T05:08:23.707 に答える