0

クエリに対してSQLサーバーに応答する時間の問題で、「タイムアウトが期限切れになりました、クエリを最適化してください」という質問をすでにしました:

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

@date送信値なしで変更し、 SqlParameter0秒で結果が得られました!!

この結果に対する提案

PS :

  • 日付を文字列 YYYYMMDD としてデータベースに保存します (PT.Date は varchar(8) です)。
  • beginDate と enddate は (20130904) のような文字列です
4

1 に答える 1

0

クエリの構造が変更されておらず、同じパラメーターで実行している場合、SQL Server がクエリの結果をキャッシュしている可能性があります。同様の問題については、この質問を参照してください。

于 2013-09-04T10:21:23.840 に答える