SqlCommand超时,即使在SQL Studio中同样的查询速度很快

时间:2013-06-19 09:24:03

标签: c# sql-server

我认为这是一个简单的查询,我从我的小日志处理应用程序执行。此方法的目的是简单地从日志表中获取最高日期值:

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)

1 个答案:

答案 0 :(得分:4)

您在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

nvarcharhigher datatype precedence而不是varchar,因此您强制对该列进行隐式转换。这将使列上的任何索引无效。

将应用程序中的参数数据类型更改为varchar