2013-09-04 4 views
0

Я уже задавала вопрос "Timeout expired, optimize query" с проблемой на некоторое время, чтобы ответить сервер SQL для моего запроса: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 
     } 
    } 
} 
} 

это займет 28 секунд для 20000 записей,

странное поведение, что я написал эту

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 
     } 
    } 
} 
} 

Я изменил @date с отправленным значением без SqlParameter и я получил результат в 0 сек !!

любое предложение для этого результата

PS:

  • мы экономим дату в базе данных в качестве строки ГГГГММДДА (PT.Date является VARCHAR (8))
  • BeginDate и EndDate (20130904)
+0

Какой тип 'beginDate'? –

+0

@BrankoDimitrijevic, begindate и enddate - это строковое значение YYYYMMDD – Akrem

+2

на этой строке 'cmd.Parameters.Add (новый SqlParameter (@begin, beginDate));' вам не хватает кавычек вокруг @begin, это опечатка? – Tanner

ответ

0

Если ваш запрос не изменяется по своей структуре и вы выполняете его с теми же параметрами th ru, возможно, SQL Server кэширует результаты вашего запроса, см. этот question для аналогичной проблемы.

Смежные вопросы