10

私はWebサービスを持っているので、ハンドラーは常に同時に複数回呼び出されます。

内部でSqlConnectionとSqlCommandを作成します。約7つの異なるコマンドを実行する必要があります。さまざまなコマンドにはさまざまなパラメーターが必要なので、一度追加するだけです。

command.Parameters.Add(new SqlParameter("@UserID", userID));
command.Parameters.Add(new SqlParameter("@AppID", appID));
command.Parameters.Add(new SqlParameter("@SID", SIDInt));
command.Parameters.Add(new SqlParameter("@Day", timestamp.Date));
command.Parameters.Add(new SqlParameter("@TS", timestamp));

次に、実行中にCommandTextプロパティを変更してから、ExecuteNonQuery()を呼び出します。またはExecuteScalar();

そして、私はパフォーマンスの問題に直面しています。たとえば、ほとんどのdebugginとprofilingは、そのコマンドを示しています

command.CommandText = "SELECT LastShowTS FROM LogForAllTime WHERE UserID = @UserID";

平均で約50msかかります。次のように変更した場合:

command.CommandText = "SELECT LastShowTS FROM LogForAllTime WHERE UserID = '" + userID.Replace("\'", "") + "'";

その後、平均で1msしかかかりません!

問題を調査する場所がわかりません。

4

2 に答える 2

16

@UserIDこれは、非定型値 (初期値の 1 つ) のクエリ プランをキャッシュし、後のクエリに貧弱なプランを再利用しているように聞こえます。2 番目のケースでは、それぞれに個別の計画があるため、これは問題ではありません。追加する必要があると思います:

OPTION (OPTIMIZE FOR UNKNOWN)

これにより、やみくもに計画を再利用することにあまり熱心ではなくなります。


別の理論:

userIDの型(C# 内) とUserID(データベース内の)の型が一致しない場合があります。これは unicode と ANSI のように単純な場合もあれば、 intvsvarchar[n]などの場合もあります。疑わしい場合は、パラメーターを構成するときに非常に具体的にし、正しいサブタイプとサイズを追加してください。

明確化

string実際、ここでの問題は、C# (Unicode) とデータベースvarchar(n)(ANSI)の違いにあるようです。したがってSqlParameter、 はそのように明示的に追加する必要があります ( DbType.AnsiString)。

于 2011-12-21T12:56:27.510 に答える
0

サーバーに 7 倍のデータを送信しているため、速度が低下します。

また、userID文字列の長さが異なる場合、SQL パラメータで明示的な長さを設定すると、クエリをより適切に再利用できます。

于 2011-12-21T12:56:51.873 に答える