我有一个我认为是从我的小日志处理应用程序执行的简单查询。此方法的目的是简单地从日志表中获取最高日期值:
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)
。