【问题标题】:sql server strange behavior (query time respond)sql server 异常行为(查询时响应)
【发布时间】:2013-09-04 10:05:14
【问题描述】:

我已经问过一个问题"Timeout expired, optimize query" 有一段时间来响应我的查询的 sql server :

using (SqlConnection sqlConn = new SqlConnection(SqlServerMasterConnection))
{
  if (sqlConn.State != ConnectionState.Open) sqlConn.Open();
  using (SqlCommand cmd = new SqlCommand("select DT.* from DetailTable DT, BillTable BT, PackageTable PT
                                         where  PT.Id= BT.IdPackage and DT.IdBill= BT.Id 
                                         and  PT.CodeCompany = @codeCompany and PT.Date between @begin and @end",
                                         sqlConn))
 {
    cmd.Parameters.Add(new SqlParameter(@begin , beginDate));
    cmd.Parameters.Add(new SqlParameter("@end", endDate));
    cmd.Parameters.Add(new SqlParameter("@codeCompany", codeCompany));
    using (DbDataReader reader = cmd.ExecuteReader())
    {
       while (reader.Read())
       {
          //work todo
       }
    }
 }
}

20,000 条记录需要 28 秒,

我写这篇文章的奇怪行为

using (SqlConnection sqlConn = new SqlConnection(SqlServerMasterConnection))
{
  if (sqlConn.State != ConnectionState.Open) sqlConn.Open();
  using (SqlCommand cmd = new SqlCommand("select DT.* from DetailTable DT, BillTable BT, PackageTable PT where  PT.Id= BT.IdPackage and DT.IdBill= BT.Id 
                                         and  PT.CodeCompany = @codeCompany and PT.Date between '" + beginDate + "' and '" + endDate + "'"
                                         ,sqlConn))
 {
    cmd.Parameters.Add(new SqlParameter("@codeCompany", codeCompany));
    using (DbDataReader reader = cmd.ExecuteReader())
    {
       while (reader.Read())
       {
          //work todo
       }
    }
 }
}

我用没有SqlParameter的发送值更改了@date,我在0秒内得到了结果!!

对此结果的任何建议

PS:

  • 我们将数据库中的日期保存为字符串 YYYYMMDD(PT.Date 是一个 varchar(8))
  • beginDate 和 enddate 是类似 (20130904) 的字符串

【问题讨论】:

  • beginDate的类型是什么?
  • @BrankoDimitrijevic,begindate 和 enddate 是字符串值 YYYYMMDD
  • cmd.Parameters.Add(new SqlParameter(@begin , beginDate)); 这一行上,@begin 周围缺少引号,这是错字吗?
  • @Tanner,数据库中的值类型是一个字符串,我发送一个字符串值,然后我必须在sqlParametre中添加一个引号!
  • 在您的第一个代码示例中,您有:@begin 应该是 "@begin",并在参数名称周围加上引号,只是检查这是否是一个错字?

标签: c# sql-server


【解决方案1】:

如果您的查询在结构上没有改变并且您正在使用相同的参数执行它,那么可能 SQL Server 正在缓存您的查询结果,请参阅此question 以了解类似问题。

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多