[英]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 Server事件探查器查看執行的確切SQL查詢,並查看延遲是否是由於Linq to Entities和SQL之間的轉換引起的。 如果確定無法簡化查詢,則可以在SQL Server級別上使用索引
希望我能幫上忙!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.