SqlCommand超时即使在SQL Studio中同样的查询速度很快
我有我认为是一个简单的查询,我从我的小日志处理应用程序执行。 此方法的目的是简单地从日志表中获取最高日期值:
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'
我已经检查了阻塞,我看不到那样的东西 – 这个数据库只能由这个应用程序访问,并且它不是multithreading或类似的东西。
更新:有趣的是,当我运行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