2013-06-05 59 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。

相關問題