2013-06-05 61 views
0

在本地开发机器上,当通过网站(ASP.NET - ADO.NET)运行时,我的查询超时无限期 相同的查询仅在昨天运行良好。当我从本地机器执行它时,它运行良好。从ADO.NET运行时查询超时但在查询中运行良好Analyer

我甚至采取了重新启动机器。它会是什么?每请求

说明:

  1. 查询超时默认30秒(在ADO.NET)之后。如果我将它设置为0(不确定) - 它将无限期运行。在查询分析器立即运行(1秒)

  2. 查询没有改变。以下是查看代码:

public static List<Shipment> GetShipments(List<string> customerIds, DateTime dateFrom, DateTime dateTo) 
{ 
    try 
    { 
     var data = new List<Shipment>(); 
     using (var connection = new SqlConnection(ConnectionString)) 
     { 
      connection.Open(); 

      const string SQL = @" 
        SELECT TOP 1000 SH.ShipmentId, SH.TripId, CASE IsCancelled WHEN 1 THEN 'X' ELSE SH.Status END Status, 
         SH.FromMunicipality, SH.FromAdministrativeArea, 
         SH.ToMunicipality, SH.ToAdministrativeArea, 
         SH.PONumber, SH.ProCodeId, SH.ShipperReferenceNumber, SH.BOLNumber, 
         T.ScheduledPickupDate, T.ScheduledDeliveryDate, 
         CASE WHEN NOT TN.PDFBinary IS NULL THEN 1 ELSE 0 END HasPOD 
        FROM dbo.vPcyShipment SH 
        INNER JOIN dbo.vPcyTrip T ON SH.TripId = T.TripId 
        LEFT OUTER JOIN dbo.tTripNumber TN ON SH.TripId = TN.TripNumber 
        WHERE SH.CustomerId IN ({0}) 
         AND T.ScheduledPickupDate BETWEEN @DateFrom AND @DateTo 
        ORDER BY T.ScheduledPickupDate DESC"; 

      var customerParamNames = customerIds.Select((s, i) => "@customer" + i.ToString(CultureInfo.InvariantCulture)).ToArray(); 
      var customerInClause = string.Join(",", customerParamNames); 

      using (var command = new SqlCommand(string.Format(SQL, customerInClause), connection)) 
      { 
       command.Parameters.AddWithValue("@DateFrom", dateFrom); 
       command.Parameters.AddWithValue("@DateTo", dateTo); 
       for (var i = 0; i < customerParamNames.Length; i++) 
       { 
        command.Parameters.AddWithValue(customerParamNames[i], customerIds[i]); 
       } 

       using (var dataTable = new DataTable()) 
       { 
        dataTable.Load(command.ExecuteReader()); 
        var query = from row in dataTable.AsEnumerable() 
           select new Shipment 
           { 
            ShipmentId = row.Field<string>("ShipmentId"), 
            TripId = row.Field<string>("TripId"), 
            PoNo = row.Field<string>("PONumber"), 
            ProCodeId = row.Field<string>("ProCodeId"), 
            ShipperRef = row.Field<string>("ShipperReferenceNumber"), 
            BolNo = row.Field<string>("BOLNumber"), 
            ProphecyStatusCode = row.Field<string>("Status"), 
            FromCity = row.Field<string>("FromMunicipality"), 
            FromState = row.Field<string>"FromAdministrativeArea"), 
            ToCity = row.Field<string>("ToMunicipality"), 
            ToState = row.Field<string>("ToAdministrativeArea"), 
            ScheduledPickup = row.Field<DateTime>("ScheduledPickupDate"), 
            ScheduledDelivery = row.Field<DateTime>("ScheduledDeliveryDate"), 
            HasPOD = row.Field<int>("HasPOD") 
         }; 

        data.AddRange(query.ToList()); 
       } 
      } 
     } 
     return data; 
    } 
    catch (Exception ex) 
    { 
     Log(ex); 
    } 

    return null; 
} 
+1

我们需要查看代码和异常以了解发生了什么。请编辑你的问题。 – mason

+1

“无限期查询超时”这是什么意思?通常,当我们说“查询超时”时,我们的意思是它没有在允许执行的时间内完成执行。鉴于此,“无限期超时”没有意义。所以你是什么意思? – jason

+0

查看修改。它无限期地运行在VS2012/C#/ ASP.NET上下文中。 – katit

回答

0

没有足够的信息去,但我会用所有您的通话更改为.AddWithValue()使用.Add(),而不是开始。当您拨打.AddWithValue()时,.Net必须猜测您的参数类型。如果它猜错了(它可以),突然你的查询可能不再与索引相匹配,这就说明了数据库性能的核心。

0

查询分析器和ADO.NET之间的性能差异通常与数据库连接的不同配置(例如ANSI_NULLS)有关。

如果您确定使用完全相同的查询(相同的客户ID,相同的日期范围),您可以尝试使用ANSI_NULLS和查询分析器中的其他设置来尝试重现您看到的行为ADO.NET。

相关问题