sqlparameter性能不佳

Але*_*дев 9 c# sql-server ado.net sqlcommand sqlparameter

我有一个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));
Run Code Online (Sandbox Code Playgroud)

然后在执行期间我只需更改CommandText prorerty,然后调用ExecuteNonQuery(); 或ExecuteScalar();

我面临性能问题.例如,小调试和分析显示该命令

command.CommandText = "SELECT LastShowTS FROM LogForAllTime WHERE UserID = @UserID";
Run Code Online (Sandbox Code Playgroud)

平均需要大约50毫秒.如果我将其更改为:

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

然后它只需要1ms的平均值!

我只是无法弄清楚在哪里调查问题.

Mar*_*ell 15

听起来它已经缓存了一个非典型@UserID值(早期版本之一)的查询计划,并且正在为以后的查询重用一个糟糕的计划.这在第二种情况下不是问题,因为每个都有一个单独的计划.我怀疑你只需要添加:

OPTION (OPTIMIZE FOR UNKNOWN)
Run Code Online (Sandbox Code Playgroud)

查询,这将使它不那么热衷于盲目地重新使用计划.


替代理论:

您可能在userID(在C#中)的类型与UserID(在数据库中)的类型不匹配.这可以像unicode vs ANSI一样简单,也可以是intvs varchar[n]等.如果有疑问,在配置参数时要非常具体,要用正确的子类型和大小添加它.

澄清

实际上,这里的问题似乎是C#string(unicode)和数据库varchar(n)(ANSI)之间的区别.的SqlParameter,因此,应明确地加入,( DbType.AnsiString).