【问题标题】:SQL Server 2008 timeout exceptionSQL Server 2008 超时异常
【发布时间】:2014-01-11 20:40:33
【问题描述】:

我正在开发无线应用程序,当我从 SQL Server 2008 查询 2000+ 行时,发生超时异常。

我在我的程序中循环使用了很多 linq。当我评论其中一些时,它会更好,但仍然会发生。

Linq 会导致性能下降吗?还有其他原因导致此问题吗?我该如何解决?

谢谢。

enter code here
                    var listShipUnit = from ShipUnit su in bdd.ShipUnit
                                       where (su.ShipmentID == shipmentNumber
                                        && (su.QStatus != "1" || su.QStatus == null)
                                        && (!su.CaseID.Equals(null) 
                                        && !su.CaseID.ToUpper().Equals("UNKNOWN") && 
                                        !su.CaseID.Equals(string.Empty) && 
                                        !su.CaseID.ToUpper().Equals("NULL") 
                                        && su.CaseID.Length > 0))
                                           group su by su.CaseID into gsu
                                           select new
                                           {
                                               gsu.Key,
                                               gsu,
                                               TotalWeight = gsu.Sum(w => w.Weight),
                                               TotalVolume = gsu.Sum(v => v.Volume),
                                               TotalCount = gsu.Sum(v => v.ShipUnitCount)
                                           };



                    foreach (var shipUnit in listShipUnit)
                    {
                        tempListShipUnitGroup.Add(new ShipUnitGroupSTL(shipUnit.gsu.ToList(), shipUnit.Key, shipUnit.TotalVolume.ToString(), shipUnit.TotalWeight.ToString(), shipUnit.TotalCount.ToString()));
                    }

                    List<ShipUnitGroupSTL> revShipUnitGroup = new List<ShipUnitGroupSTL>();
                    List<string> finishPallet = new List<string>();
                    List<string> finishCase = new List<string>();


                    // 2013.12.19 device null exception ---> start
                    var stlunits = bdd.ScanToLoad;
                    List<ScanToLoad> stlList = stlunits.ToList();

                    //var shipunits = bdd.ShipUnit;
                    //List<ShipUnit> shipunitList = shipunits.ToList();

                    if (stlList != null && stlList.Count() > 0)
                    // 2013.12.19 device null exception --- end
                    {
                        //// get the recently record from STL talbe
                        foreach (var shipUnitGroup in tempListShipUnitGroup)
                        {
                            string tempCaseID;
                            string tempPalletID;

                            var unit = shipUnitGroup.GroupShipUnit;


                            tempCaseID = shipUnitGroup.GroupKey;
                            tempPalletID = unit.FirstOrDefault().PalletID;

                        //    // 2013.12.19 device null exception ---> start
                        //    // look up the caseId in the STL table
                            var stlunit = stlList
                                        .Where(s => s.CaseID.Equals(tempCaseID))
                                        .OrderByDescending(s => s.UpdateDate);

                        //    //var stlunit = bdd.ScanToLoad
                        //    //            .Where(s => s.ScanToLoadID.Equals(tempCaseID)
                        //    //                || s.CaseID.Equals(tempCaseID))
                        //    //            .OrderByDescending(s => s.UpdateDate);

                        //    // 2013.12.19 device null exception ---> end



                            if (stlunit != null && stlunit.Count() > 0)
                            {
                                string stlPallet = null;

                                stlPallet = stlunit.FirstOrDefault().NewPalletID;

                                if (!string.IsNullOrEmpty(stlPallet))
                                {
                                    if (tempPalletID.Equals(stlPallet))
                                    {
                                        finalListShipUnitGroup.Add(shipUnitGroup);
                                        //continue;
                                    }
                                    else
                                    {
                                        var revShipUnit = bdd.ShipUnit
                                                    .Where(su => su.ShipmentID == shipmentNumber
                                                        && (su.QStatus != "1" || su.QStatus == null)
                                                        && su.PalletID.Equals(stlPallet));

                                        if (revShipUnit != null && revShipUnit.Count() > 0)
                                        {
                                            unit.FirstOrDefault().PalletID = stlPallet;
                                            finalListShipUnitGroup.Add(shipUnitGroup);
                                        }
                                    }
                                }
                                else
                                {
                                    finalListShipUnitGroup.Add(shipUnitGroup);
                                    //continue;
                                }


                            }
                            else
                            {
                                finalListShipUnitGroup.Add(shipUnitGroup);
                                //continue;
                             }

                            finishCase.Add(tempCaseID);
                            var checkFinshPallet = finishPallet
                                                    .Contains(tempPalletID);

                            if (checkFinshPallet)
                            {
                                continue;
                            }

                            finishPallet.Add(tempPalletID);

                        }


                        foreach (var tempPalletID in finishPallet)
                        {
                            // look up the pallet in the STL table, add others new caseId in STL table
                            var stlunitPal = stlList
                                        .Where(s => s.NewPalletID.Equals(tempPalletID))
                                        .OrderByDescending(s => s.UpdateDate);

                            if (stlunitPal != null && stlunitPal.Count() > 0)
                            {
                                //IEnumerable<MobilePlusServer.ShipUnit> newCaseList;
                                string stlPalletID;

                                // add and remove case from the Pallet
                                foreach (var s in stlunitPal)
                                {
                                    stlPalletID = s.NewPalletID;

                                    //var addSus = from ShipUnit su in bdd.ShipUnit
                                    //             where (su.CaseID.Equals(s.CaseID) && su.RecordID.Equals(s.CaseRecordID))
                                    //                    && (su.QStatus != "1" || su.QStatus == null)
                                    //             group su by su.CaseID into gsu
                                    //             select new
                                    //             {
                                    //                 gsu.Key,
                                    //                 gsu,
                                    //                 TotalWeight = gsu.Sum(w => w.Weight),
                                    //                 TotalVolume = gsu.Sum(v => v.Volume),
                                    //                 TotalCount = gsu.Sum(v => v.ShipUnitCount)
                                    //             };

                                    var addSus = from ShipUnit su in bdd.ShipUnit
                                                 where (su.CaseID.Equals(s.CaseID) && su.RecordID.Equals(s.CaseRecordID)
                                                     && (su.QStatus != "1" || su.QStatus == null))
                                                 select su;


                                    if (addSus != null && addSus.Count() > 0)
                                    {
                                        var addSu = addSus.FirstOrDefault();

                                        // get the remove pallet id
                                        string adShipmentID = addSu.ShipmentID;
                                        string adPalletID = addSu.PalletID;
                                        //string adRecordID = unit.FirstOrDefault().RecordID.ToString();
                                        //string adCaseID = unit.FirstOrDefault().RecordID.ToString();
                                        if (!shipmentNumber.Equals(adShipmentID)
                                            && !finishCase.Contains(s.CaseID))
                                        {
                                            // set new pallet id
                                            addSu.PalletID = stlPalletID;

                                            finalListShipUnitGroup.Add(new ShipUnitGroupSTL(
                                                addSus.ToList(),
                                                s.CaseID,
                                                addSu.Volume.ToString(),
                                                addSu.Weight.ToString(),
                                                addSu.ShipUnitCount.ToString()));
                                        }
                                    }
                                }
                            }
                        }
                    }
                    // 2013.12.19 device null exception ---> start
                    else
                    {
                        finalListShipUnitGroup = tempListShipUnitGroup;
                    }

【问题讨论】:

  • Linq 是一个让事情变慢的层,但这不是你的问题。发布您正在使用的代码/查询,回答这个问题会容易得多。
  • 向我们展示一些东西!我们看不到您的屏幕,也看不到您的想法 - 您必须向我们展示您的身份正在做。你的表是什么样子的,你对它们运行什么查询?这些表上是否有任何索引 - 如果有,what 索引?表中有多少行,您使用查询读取了多少行?
  • @paqogomez linq 不应该放慢速度,特别是除非查询评估被强制然后进一步查询(例如myquery.ToList().Where(x =&gt; x.Thing == MatchingThing))。
  • @adhocgeek 我的评论只是 linq 是一个抽象层,因此与原始 sql 相比,它本质上会减慢速度。然而,实际意义上的差异可以忽略不计,显然不是 Eric 的问题
  • 这不是我的意思——说“Linq 是一个让事情变慢的层”是一种误导。这就像说“C# 是一种解释型语言,所以它一定会很慢”。国际海事组织这是你应该谨慎对待新海报的那种回应,即使在 cmets 中也是如此。

标签: c# sql linq sql-server-2008 timeout


【解决方案1】:

您可以使用 SQL 上的索引来获得更快的查询 我建议在您的加入字段上使用索引

请参阅此文档hereherehere

【讨论】:

  • 谢谢普亚。我会试试的。
【解决方案2】:

拥有如此复杂的查询,很容易被解释为设计不佳(无论是在查询中还是在数据库中)。我建议将您的查询分解为较小的查询,然后组合它们。这将使您获得更清晰的代码和逻辑。然后您可以使用SQL server profiler 查看执行的确切sql 查询,并查看延迟是否是由于Linq 到实体和SQL 之间的转换。如果您确定无法简化查询,则可以在 SQL Server 级别使用indexing

希望我能帮上忙!

【讨论】:

  • 谢谢。潘泰利斯。它的设计真的很糟糕,还有很多复杂的 Linq。我认为这是原因。我会尝试添加索引
猜你喜欢
  • 2017-07-02
  • 2023-03-15
  • 2013-04-11
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多