दरअसल, आपने इसे जिस तरह से लिखा है, आपका पहला विकल्प तेज होगा।
-
आपके दूसरे उदाहरण में समस्या है। आप sql =+ sql + आदि कर रहे हैं। यह लूप के प्रत्येक पुनरावृत्ति के लिए एक नई स्ट्रिंग ऑब्जेक्ट बनाने जा रहा है। (स्ट्रिंगबिल्डर वर्ग देखें)। तकनीकी रूप से, आप पहली बार में भी एक नई स्ट्रिंग ऑब्जेक्ट बनाने जा रहे हैं, लेकिन अंतर यह है कि इसे पिछले स्ट्रिंग विकल्प से सभी जानकारी को कॉपी करने की आवश्यकता नहीं है।
-
जिस तरह से आपने इसे स्थापित किया है, SQL सर्वर को संभावित रूप से एक विशाल क्वेरी का मूल्यांकन करना होगा जब आप अंततः इसे भेजते हैं जो निश्चित रूप से यह पता लगाने के लिए कुछ समय लेने वाला है कि इसे क्या करना है। मुझे बताना चाहिए, यह इस बात पर निर्भर है कि आपको कितनी बड़ी संख्या में सम्मिलित करने की आवश्यकता है। यदि n छोटा है, तो आप शायद ठीक होने जा रहे हैं, लेकिन जैसे-जैसे यह बढ़ता जाएगा आपकी समस्या और भी बदतर होती जाएगी।
SQL सर्वर बैच लेनदेन को कैसे संभालता है, इसके कारण बल्क इंसर्ट व्यक्तिगत लोगों की तुलना में तेज़ होते हैं। यदि आप सी # से डेटा डालने जा रहे हैं तो आपको पहला दृष्टिकोण लेना चाहिए और प्रत्येक 500 प्रविष्टियों को लेनदेन में कहें और इसे प्रतिबद्ध करें, फिर अगले 500 और इसी तरह करें। इसका यह भी फायदा है कि यदि कोई बैच विफल हो जाता है, तो आप उन्हें फंसा सकते हैं और पता लगा सकते हैं कि क्या गलत हुआ और उन्हें फिर से डालें। इसे करने के और भी तरीके हैं, लेकिन यह निश्चित रूप से प्रदान किए गए दो उदाहरणों में सुधार होगा।
var iCounter = 0;
foreach (Employee item in employees)
{
if (iCounter == 0)
{
cmd.BeginTransaction;
}
string sql = @"INSERT INTO Mytable (id, name, salary)
values ('@id', '@name', '@salary')";
// replace @par with values
cmd.CommandText = sql; // cmd is IDbCommand
cmd.ExecuteNonQuery();
iCounter ++;
if(iCounter >= 500)
{
cmd.CommitTransaction;
iCounter = 0;
}
}
if(iCounter > 0)
cmd.CommitTransaction;