मैं SQL सर्वर से डेटा को संसाधित करने के लिए LinqToSQL का उपयोग कर रहा हूं ताकि इसे आगे की प्रक्रिया के लिए iSeries सर्वर में डंप कर सकें। More details on that here।तेजी से क्या है? स्ट्रक्चर सरणी या डेटाटेबल
मेरी समस्या यह है कि डेटा की उन 350 पंक्तियों को संसाधित करने में लगभग 1.25 मिनट लगते हैं। मैं अभी भी SQL सर्वर प्रोफाइलर से परिणामों को समझने की कोशिश कर रहा हूं, लेकिन प्रश्नों का एक टन चल रहा है।
using (CarteGraphDataDataContext db = new CarteGraphDataDataContext())
{
var vehicles = from a in db.EquipmentMainGenerals
join b in db.EquipmentMainConditions on a.wdEquipmentMainGeneralOID equals b.wdEquipmentMainGeneralOID
where b.Retired == null
orderby a.VehicleId
select a;
et = new EquipmentTable[vehicles.Count()];
foreach (var vehicle in vehicles)
{
// Move data to the array
// Rates
GetVehcileRates(vehicle.wdEquipmentMainGeneralOID);
// Build the costs accumulators
GetPartsAndOilCosts(vehicle.VehicleId);
GetAccidentAndOutRepairCosts(vehicle.wdEquipmentMainGeneralOID);
// Last Month's Accumulators
et[i].lastMonthActualGasOil = GetFuel(vehicle.wdEquipmentMainGeneralOID) + Convert.ToDecimal(oilCost);
et[i].lastMonthActualParts = Convert.ToDecimal(partsCost);
et[i].lastMonthActualLabor = GetLabor(vehicle.VehicleId);
et[i].lastMonthActualOutRepairs = Convert.ToDecimal(outRepairCosts);
et[i].lastMonthActualAccidentCosts = Convert.ToDecimal(accidentCosts);
// Move more data to the array
i++;
}
}
तरीकों जाओ सब के समान दिखाई:: यहाँ है कि मैं क्या कर रहा हूँ पर थोड़ा और अधिक विस्तार है
private void GetPartsAndOilCosts(string vehicleKey)
{
oilCost = 0;
partsCost = 0;
using (CarteGraphDataDataContext db = new CarteGraphDataDataContext())
{
try
{
var costs = from a in db.WorkOrders
join b in db.MaterialLogs on a.WorkOrderId equals b.WorkOrder
join c in db.Materials on b.wdMaterialMainGeneralOID equals c.wdMaterialMainGeneralOID
where (monthBeginDate.Date <= a.WOClosedDate && a.WOClosedDate <= monthEndDate.Date) && a.EquipmentID == vehicleKey
group b by c.Fuel into d
select new
{
isFuel = d.Key,
totalCost = d.Sum(b => b.Cost)
};
foreach (var cost in costs)
{
if (cost.isFuel == 1)
{
oilCost = (double)cost.totalCost * (1 + OVERHEAD_RATE);
}
else
{
partsCost = (double)cost.totalCost * (1 + OVERHEAD_RATE);
}
}
}
catch (InvalidOperationException e)
{
oilCost = 0;
partsCost = 0;
}
}
return;
}
मेरे सोच यहाँ डीबी के लिए क्वेरी की संख्या नीचे काटने है में तेजी लाने चाहिए प्रसंस्करण। यदि LINQ प्रत्येक रिकॉर्ड के लिए एक चयन करता है, तो मुझे पहले प्रत्येक रिकॉर्ड को स्मृति में लोड करने की आवश्यकता है।
मैं अब भी सामान्य रूप से सी # और ओओपी के साथ शुरुआत करने वाला हूं (मैं ज्यादातर आईएसरीज पर आरपीजी प्रोग्रामिंग करता हूं)। तो मुझे लगता है कि मैं कुछ बेवकूफ कर रहा हूँ। क्या आप मेरी मूर्खता को ठीक करने में मदद कर सकते हैं (कम से कम इस समस्या के साथ)?
अद्यतन: सोचा कि मैं वापस आऊंगा और जो मैंने खोजा है उस पर आपको अपडेट करूँगा। ऐसा लगता है कि डेटाबेस खराब डिजाइन किया गया था। जो कुछ भी LINQ पृष्ठभूमि में उत्पन्न कर रहा था वह अत्यधिक अक्षम कोड था। मैं यह नहीं कह रहा कि LINQ खराब है, यह सिर्फ इस डेटाबेस के लिए बुरा था। मैं एक साथ जल्दी से फेंक दिया .XSD सेटअप और प्रसंस्करण समय 1.25 मिनट से 15 सेकंड तक चला गया। एक बार जब मैं एक उचित रीडिज़ाइन करता हूं, तो मैं केवल अनुमान लगा सकता हूं कि मैं इसके कुछ और सेकंड बंद कर दूंगा। आप सभी के लिए धन्यवाद। मैं एक बेहतर डेटाबेस पर कुछ अन्य दिन LINQ फिर से कोशिश करूंगा।
मेरे अपने 2 सेंट, डेटाटेबल्स के पास इस दशक में कोड में कोई भी स्थान नहीं है। –