【问题标题】:Query times out when run from ADO.NET but runs fine in Query Analyer从 ADO.NET 运行时查询超时,但在查询分析器中运行良好
【发布时间】:2013-06-05 01:49:08
【问题描述】:

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

我什至求助于重新启动机器。会是什么?

每个请求的解释:

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

【问题讨论】:

  • 我们需要查看代码和异常来了解发生了什么。请编辑您的问题。
  • "查询无限期超时" 这是什么意思?通常,当我们说“查询超时”时,我们的意思是它没有在允许执行的时间内完成执行。鉴于此,“无限期超时”没有意义。那么,你的意思是什么?
  • 查看编辑。它从 VS2012/C#/ASP.NET 上下文无限期运行
  • 之前以多种形式询问了无数次:搜索参数嗅探、缓存查询计划、统计信息......
  • 米奇,是的,它看起来像那样。我怎样才能检查这些东西?

标签: c# asp.net sql-server tsql ado.net


【解决方案1】:

没有足够的信息继续下去,但我会先将您的所有呼叫更改为 .AddWithValue() 以改用 .Add()。当您调用.AddWithValue() 时,.Net 必须猜测您的参数类型是什么。如果它猜错了(它可以),突然间您的查询可能不再与索引匹配,这说明了数据库性能的核心。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 2010-09-05
      • 2015-03-17
      • 1970-01-01
      相关资源
      最近更新 更多