SqlCommand超时,即使在SQL Studio中相同的查询是快速的
本文关键字:查询 Studio 超时 SQL SqlCommand | 更新日期: 2023-09-27 18:18:57
我从我的小日志处理应用程序中执行了一个我认为是简单的查询。此方法的目的是简单地从日志表中获取最高日期值:
private DateTime GetLastEntryDate(string serverName, string siteName)
{
DateTime dt = DateTime.MinValue;
using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LogParserDB"].ConnectionString))
{
con.Open();
using (var cmd = new SqlCommand("SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site", con))
{
cmd.CommandTimeout = 120;
cmd.Parameters.AddWithValue("Host", serverName);
cmd.Parameters.AddWithValue("Site", siteName);
var result = cmd.ExecuteScalar();
if (result != DBNull.Value)
{
dt = (DateTime)result;
}
}
}
return dt;
}
表上有一些索引,但我不确定这是否相关,因为我得到的问题是,当我运行这段代码时,它在ExecuteScalar
行上2分钟后抛出超时。
如果我复制并粘贴该查询到SSMS具有相同的参数,它完成在00:00:04,甚至00:00:00(如果我刚刚更新统计)。
SELECT MAX(date) FROM iislogs WHERE host='servername' AND site='W3SVC1'
我已经检查了阻塞,我看不到这样的东西-这个数据库是只有被这个应用程序访问,它不是多线程或类似的东西。
更新:有趣的是,当我运行Profiler捕获的确切查询时,它在SSMS中也花费了很长时间:
exec sp_executesql N'SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site',N'@Host nvarchar(13),@Site nvarchar(6)',@Host=N'servername',@Site=N'W3SVC1'
实际列分别为varchar(50)
和varchar(10)
在SSMS中执行的查询
SELECT MAX(date)
FROM iislogs
WHERE host = 'servername'
AND site = 'W3SVC1'
与应用程序执行的不一样。
EXEC sp_executesql
N'SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site',
N'@Host nvarchar(13),@Site nvarchar(6)',
@Host=N'servername',
@Site=N'W3SVC1'
第一个具有varchar
字符串字面值。第二个具有nvarchar
参数。您的列数据类型实际上是varchar
。
nvarchar
具有比varchar
更高的数据类型优先级,因此强制对列进行隐式强制转换。这将使列上的任何索引都变得无用。
将应用程序中的参数数据类型更改为varchar