gpt4 book ai didi

c# - sqlparameter 性能不佳

转载 作者:太空狗 更新时间:2023-10-29 17:40:41 26 4
gpt4 key购买 nike

我有一个网络服务,所以处理程序一直被同时调用多次。

我在里面创建了 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 prorerty,然后调用 ExecuteNonQuery();或 ExecuteScalar();

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

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

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

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

那么平均只需要1ms!

我只是不知道在哪里调查问题。

最佳答案

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

OPTION (OPTIMIZE FOR UNKNOWN)

查询,这将减少盲目重用计划的热情。


替代理论:

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

澄清

确实,这里的问题似乎是 C# string (unicode) 和数据库 varchar(n) (ANSI) 之间的区别。因此,应该显式添加 SqlParameter (DbType.AnsiString)。

关于c# - sqlparameter 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8590103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com