2012-09-13 10 views
6

मुझे डेटा लोडिंग के प्रदर्शन में सुधार करने की आवश्यकता है। वर्तमान algorythm एक मेज से एक पूर्ण चयन करता है:डेटा सम्मिलित/अद्यतन प्रदर्शन में सुधार कैसे करें?

select Field1, Field2,...,FieldN from Table1 order by FieldM 

नए डेटा एक पाठ फ़ाइल से पढ़ने (जैसे, datatable प्रति पंक्ति textfile लाइन)। तालिका में प्राथमिक कुंजी है, जिसमें दो फ़ील्ड हैं। टेक्स्टफाइल की प्रत्येक पंक्ति के लिए यह आवश्यक दो पंक्तियों (यानी प्राथमिक कुंजी) द्वारा आवश्यक पंक्ति का पता लगाती है।

query.Locate('Field1;Field2',VarArrayOf([Value1,Value2]),[]); 

Locate तो रिटर्न True, यह पंक्ति संपादित करता है, अन्यथा यह एक नया जोड़ देता है।

तो, जहां तक ​​तालिका में लगभग 200000 पंक्तियां होती हैं, प्रत्येक Locate ऑपरेशन में कुछ समय लगता है ... इसलिए यह प्रति सेकंड लगभग 5-6 पंक्तियों को अपडेट करने का प्रबंधन करता है।

मुझे इसे सुधारने के लिए किन चीजों पर विचार करना चाहिए?

शायद अलग-अलग प्रश्नों के साथ इस महान चयन के माध्यम से ढूंढने की जगह बदलें?

उत्तर

10

स्थान() का उपयोग न करें। यदि आप पता() का उपयोग करते हैं तो डेल्फी क्लाइंट साइड पर पंक्ति की खोज करता है केवल आपकी क्वेरी से पंक्ति सेट स्कैन करने में बहुत समय लगता है।

यदि आपके पास संग्रहीत प्रक्रियाओं को बनाने के लिए MSSQL तक पहुंच है तो निम्न प्रक्रिया बनाएं और बिना किसी शर्त के अपने टेक्स्ट फ़ाइल से प्रत्येक पंक्ति के लिए इसे चलाएं (डेल्फी में TAdoStoredProc.ExecProc का उपयोग करें)। तो इस मामले में आपको पहले चयन और पता प्रक्रिया की आवश्यकता नहीं है। यह रिकॉर्ड अपडेट करता है अगर दायर 1 और फ़ील्ड 2 पाए जाते हैं और यदि नहीं करते हैं तो डालें।

CREATE PROCEDURE dbo.update_table1 
@Field1 int, --key1 
@Field2 int, --key2 
@Field3 int, -- data fileds 
@Field4 int 

AS 

SET NOCOUNT ON 
update table1 set [email protected],[email protected] 
     where [email protected] and [email protected]; 
IF(@@Rowcount=0) 
BEGIN 
    insert into table1(Field1,Field2,Field3,Field4) 
       values (@Field1,@Field2,@Field3,@Field4); 
END 
GO 

यहाँ एडीओ के साथ इस संग्रहीत प्रक्रिया को लागू करने की डेल्फी कोड है:

...... 
var 
    ADOStoredP: TADOStoredProc; 

    ...... 
begin 

........ 
    ADOStoredP:=TADOStoredProc.Create(nil); 
    try 
     ADOStoredP.Connection:=DataMod.SQL_ADOConnection; //Your ADO Connection instance here 
     ADOStoredP.ProcedureName:='Update_table1'; 
     ADOStoredP.Parameters.CreateParameter('@Field1', ftInteger, pdInput, 0, 0); 
     ADOStoredP.Parameters.CreateParameter('@Field2', ftInteger, pdInput, 0, 0); 
     ADOStoredP.Parameters.CreateParameter('@Field3', ftInteger, pdInput, 0, 0); 
     ADOStoredP.Parameters.CreateParameter('@Field4', ftInteger, pdInput, 0, 0); 

     While() -- Your text file loop here 
     begin 

     ADOStoredP.Parameters.ParamByName('@Field1').Value:=Field1 value from text file here; 
     ADOStoredP.Parameters.ParamByName('@Field2').Value:=Field2 value from text file here; 
     ADOStoredP.Parameters.ParamByName('@Field3').Value:=Field3 value from text file here; 
     ADOStoredP.Parameters.ParamByName('@Field4').Value:=Field4 value from text file here; 

     ADOStoredP.ExecProc; 

     end 

    finally 
     if Assigned(ADOStoredP) then 
     begin 
     ADOStoredP.Free; 
     end; 
    end; 

........ 
end; 
+3

इस समाधान ने लोडिंग समय को 4 घंटे से 4 मिनट से कम कर दिया। तुम्हारी मदद के लिए शुक्रिया! धन्यवाद! – horgh

5
  1. यदि यह संभव है, तो आपको SQL सर्वर चला रहे सर्वर पर टेक्स्ट फ़ाइल भेजनी चाहिए। फिर टेक्स्ट फ़ाइल खोलने के लिए OPENROWSET(BULK) का उपयोग करें (देखें "ई। टेक्स्ट फ़ाइल से पंक्तियों को पुनर्प्राप्त करने के लिए एक प्रारूप फ़ाइल के साथ OPENROWSET बल्क प्रदाता का उपयोग करना")।
  2. यदि आप सर्वर पर टेक्स्ट फ़ाइल नहीं भेज सकते हैं, तो एक अस्थायी या लगातार डीबी तालिका बनाएं और तालिका में सभी टेक्स्ट फ़ाइल पंक्तियों को सम्मिलित करने के लिए INSERT का उपयोग करें।
  3. यदि आप SQL Server 2008 का उपयोग कर रहे हैं, तो आपको MERGE ऑपरेटर का उपयोग करना चाहिए। यदि अधिक पुराना SQL सर्वर संस्करण है, तो आप दो SQL कमांड का उपयोग कर सकते हैं: अद्यतन और INSERT। और डेटा स्रोत उपयोग के रूप में (1) OPENROWSET या (2) डीबी तालिका।
+0

हालांकि यह बहुत मेरी स्थिति पर Valex द्वारा जवाब लागू करने के लिए आसान था, मदद के लिए धन्यवाद। लक्ष्य एसक्यूएल सर्वर भी 2000 है। एक सुंदर पुराना है। कुछ अस्थायी तालिका (और इतने पर ..) में फ़ाइलों को लोड करने के लिए पूरे algorythm को रीमेक करना किसी भी प्रदर्शन लाभ (यदि कोई है) के लायक नहीं है जो मैंने हासिल किया है (और इसके लिए मैंने कितना समय बिताया) valex द्वारा दिए गए विचार के लिए धन्यवाद । कोई बात नहीं धन्यवाद! – horgh

संबंधित मुद्दे