簡體   English   中英

SQL Server 2008超時異常

[英]SQL Server 2008 timeout exception

我正在開發無線應用程序,當我從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;
                    }

您可以在SQL上使用索引以獲取更快的查詢,建議您在連接字段上使用索引

在此處此處此處查看此文檔

擁有如此復雜的查詢,可以很容易地將其解釋為不良設計的指示(無論是在查詢中還是在數據庫中)。 我建議將您的查詢分解為較小的查詢,然后將其組合。 這將使您更清晰的代碼和邏輯。 然后,您可以使用SQL Server事件探查器查看執行的確切SQL查詢,並查看延遲是否是由於Linq to Entities和SQL之間的轉換引起的。 如果確定無法簡化查詢,則可以在SQL Server級別上使用索引

希望我能幫上忙!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM