2008-12-02 10 views
9

जो तेज होगा।डेटाटेडर डेटासेट से तेज है जब डेटाटेबल पॉप्युलेट कर रहा है?

1) किसी DataReader लूपिंग और एक कस्टम पंक्तियों और स्तंभों के आधार आबादी वाले datatable

2) या बनाने एक dataAdapter वस्तु और बस (.Fill) एक datatable ing बनाने।

क्या डेटरेडर का प्रदर्शन अभी भी एक डाटाएबल के गतिशील निर्माण पर सच है?

उत्तर

9

डेटा एडाप्टर हुड के नीचे डेटा रीडर का उपयोग करता है ताकि आपका अनुभव वही होगा।

डेटा एडाप्टर का लाभ क्या आप बहुत सारे कोड को काटते हैं जिन्हें रखरखाव की आवश्यकता होगी।

+0

मेरी पोस्ट देखें: यह डेटा एडाप्टर का उपयोग करने से कम कोड है। –

3
:

यह बहस एक धार्मिक मुद्दा का एक सा तो निश्चित रूप से चारों ओर देखने और यह तय करें कि अपनी स्थिति के लिए सबसे अच्छा काम करता है

मैं एक डेटाटेबल प्रति भरने के लिए बात नहीं कर सकता से लेकिन एक datareader का उपयोग सबसे कुशल पढ़ने विधि है।

+1

मैंने हमेशा सोचा है कि क्या यह डेटा के साथ हम क्या करते हैं उस पर निर्भर करता है। चूंकि DataReader जानकारी को बफर करने के लिए डेटाबेस सर्वर पर निर्भर करता है, इसलिए बड़े परिणाम सेट पर, यदि हमारी गणना जटिल है, जैसे नेटवर्क ग्राफ़ बनाना, जो हर नए नोड के साथ कठिन हो जाता है, तो यह डेटाबेस.ट्रू को बंद कर देगा? – Haoest

7

आपका विकल्प # 1 धीमा हो जाएगा।

DataTable dt = new DataTable(); 

using (SqlConnection conn = GetOpenSqlConnection()) 
using (SqlCommand cmd = new SqlCommand("SQL Query here", conn) 
using (IDataReader rdr = cmd.ExecuteReader()) 
{ 
    dt.Load(rdr); 
} 

मैं इस और .Fill() का उपयोग कर के बीच अंतर पर कोई टिप्पणी नहीं कर सकते हैं: हालांकि, वहाँ एक बेहतर तरीका हाथ से कस्टम पंक्तियों जोड़ने से एक datatable के लिए एक DataReader कन्वर्ट करने के लिए है।

+0

धन्यवाद! मैं देख रहा था कि डेटाटेडर से डेटाटेबल कितना लोड होता है क्योंकि मेरे पास एक संग्रहित-प्रो है जो एकाधिक टेबल लौटाती है, लेकिन मुझे केवल आउटपुट टेबल में से एक को डेटाटेबल भरना होगा। – Yoopergeek

1

उदाहरण के लिए आपको डेटा लोडर रखना अच्छा लगता है उदाहरण के लिए लोडिंग डेटा की प्रगति दिखाएं। डेटासेट में आप डेटा लोड करने के बीच में कुछ नहीं कर सकते हैं।

दूसरी तरफ डेटासेट सभी ऑब्जेक्ट है। तो डेटासेट बहुत धीमी है। डेटा रीडर आपको अपने कोड के स्थानों में अतिरिक्त बढ़ावा दे सकता है जहां डेटा ऑपरेशन बहुत धीमा है। इन स्थानों में इसे डेटासेट से डेटा रीडर में बदलें। डेटा रीडर मेमोरी में भी कम जगह लेता है।

ओह कोर्स में अच्छा डेटा रीडर कोड करने में अधिक समय लगता है, लेकिन यह इसके लायक है। उदाहरण के लिए जब आप डेटाबेस से ली गई छवियों या संगीत के साथ खेलते हैं।

More on this topic in MSDN Magazine

2

DataReader तेज है। और यदि आप 2.0+ का उपयोग कर रहे हैं तो आपको एक डेटाटेबल का उपयोग करने की भी आवश्यकता नहीं है। आप अपनी वस्तु की एक सामान्य सूची का उपयोग कर सकते हैं।

+1

वर्ष 2008 से आपका बयान मुझे अब 2015 के अंत में मदद करता है :) SqlDataAdapter और SqlDataReader डेटाटेबल लोड करने के लिए 6.x मिनट लेता है, लेकिन लिंक लोड करने के लिए केवल 1.7 सेकेंड लेता है (56460 पंक्तियां)। –

+0

@Palani कुमार: क्या आप कृपया मुझे बता सकते हैं कि डेटा रीडर का उपयोग करके सूची के साथ आप सीधे संग्रहीत प्रक्रिया परिणाम कैसे लोड करेंगे ?? –

+1

@ लर्निंग, मैंने ऑब्जेक्ट की सूची के रूप में संग्रहित प्रसंस्करण प्राप्त करने के लिए EntityFramework का उपयोग किया। यदि आप डेटारेडर को सूची में कनवर्ट करना चाहते हैं तो यहां http: // stackoverflow देखें।कॉम/प्रश्न/1464883/कैसे-कर-मैं-आसानी से कनवर्ट-डेटरेडर-टू-लिस्ट –

11

मान लीजिए कि आप वास्तव में डेटाबेस से वापस आने वाले सभी डेटा चाहते हैं, डेटाबेस और नेटवर्क पर लिया गया समय स्मृति में डेटा संरचनाओं को पॉप्युलेट करने के लिए प्रक्रिया में किए गए समय को बौने के लिए लगभग निश्चित है।

हां, कुछ मामलों में आपको डेटा रीडर का उपयोग करके एक छोटी बचत मिल सकती है - और विशेष रूप से यदि आप डेटा स्ट्रीम करना चाहते हैं तो यह उपयोगी हो सकता है - लेकिन यदि आपको वास्तव में यह सब चाहिए, तो मैं सबसे सरलता से चिपकूँगा कोड।अगर आपको लगता है कि डेटासेट जनसंख्या एक महत्वपूर्ण प्रदर्शन समस्या पैदा कर रही है, तो इसे प्रोफाइल करें और फिर इसे सुधारने का प्रयास करें।

+0

+1 "प्रोफ़ाइल" के लिए +1। – Dan

1

इस तरह के कई प्रश्नों के साथ उत्तर है: निर्भर करता है।

यदि आप अपने डेटा की संरचना को आगे नहीं जानते हैं और फ्लाई पर टेबलएडाप्टर बना रहे हैं, तो गतिशील डेटाटेबल अधिक कुशल होगा। TableAdapter बनाने में शामिल कोड जनरेशन का एक अच्छा सौदा है।

हालांकि, यदि आप अपने डेटा की संरचना को आगे जानते हैं तो प्रश्न बन जाता है, मुझे कितनी कार्यक्षमता की आवश्यकता है?

यदि आपको पूर्ण सीआरयूडी कार्यान्वयन की आवश्यकता है तो आपके द्वारा सीआरयूडी कोड को लिखने के बजाय टेबलएडाप्टर का उपयोग करके प्राप्त कुछ क्षमताएं हैं। साथ ही, TableAdapter कार्यान्वयन ठीक है (महान नहीं)। यदि आपको कुछ और अधिक कुशलता की आवश्यकता है तो आप nHibernate या कुछ अन्य ORM का उपयोग करके बेहतर हो सकते हैं।

यदि आपको पूर्ण सीआरयूडी कार्यान्वयन की आवश्यकता नहीं है (यानी, यह केवल पढ़ने योग्य समाधान है) और अपनी डेटा संरचना को सामने रखें, तो आपको टेबलएडाप्टर के केवल पढ़ने के लिए कार्यान्वयन की दक्षता का परीक्षण करना होगा एक गतिशील रूप से जेनरेट किया गया डेटाटेबल। अगर मैं सट्टेबाजी करने वाला व्यक्ति था तो मैं टेबल एडाप्टर कार्यान्वयन पर अपना पैसा डालूंगा क्योंकि आप एक बार डेटा बाध्य करते हैं और इसे कई बार पढ़ते हैं।

1

DataReaderRead पर जा रहा है जो केवल एकमात्र, एक-पंक्ति-पर-समय दृष्टिकोण है, जो क्रमशः डेटा पढ़ता है ताकि आप कनेक्ट होने पर पढ़े जाने पर जैसे ही रिकॉर्ड प्राप्त कर सकें, स्मृति और प्रदर्शन के लिए सबसे अच्छा है।

ने कहा कि, दो दृष्टिकोणों के बीच, मुझे DataTable.Load से बहुत तेज लगता है। पाठ्यक्रम कि कार्यान्वयन पर निर्भर करता है की .. यहाँ दो जो मैं here पोस्ट के बीच एक बेंचमार्क है:

public DataTable Read1<T>(string query) where T : IDbConnection, new() 
{ 
    using (var conn = new T()) 
    { 
     using (var cmd = conn.CreateCommand()) 
     { 
      cmd.CommandText = query; 
      cmd.Connection.ConnectionString = _connectionString; 
      cmd.Connection.Open(); 
      var table = new DataTable(); 
      table.Load(cmd.ExecuteReader()); 
      return table; 
     } 
    } 
} 

public DataTable Read2<S, T>(string query) where S : IDbConnection, new() 
              where T : IDbDataAdapter, IDisposable, new() 
{ 
    using (var conn = new S()) 
    { 
     using (var da = new T()) 
     { 
      using (da.SelectCommand = conn.CreateCommand()) 
      { 
       da.SelectCommand.CommandText = query; 
       da.SelectCommand.Connection.ConnectionString = _connectionString; 
       DataSet ds = new DataSet(); //conn is opened by dataadapter 
       da.Fill(ds); 
       return ds.Tables[0]; 
      } 
     } 
    } 
} 

दूसरा दृष्टिकोण हमेशा पहले से बेहतर प्रदर्शन किया।

Stopwatch sw = Stopwatch.StartNew(); 
DataTable dt = null; 
for (int i = 0; i < 100; i++) 
{ 
    dt = Read1<MySqlConnection>(query); // ~9800ms 
    dt = Read2<MySqlConnection, MySqlDataAdapter>(query); // ~2300ms 

    dt = Read1<SQLiteConnection>(query); // ~4000ms 
    dt = Read2<SQLiteConnection, SQLiteDataAdapter>(query); // ~2000ms 

    dt = Read1<SqlCeConnection>(query); // ~5700ms 
    dt = Read2<SqlCeConnection, SqlCeDataAdapter>(query); // ~5700ms 

    dt = Read1<SqlConnection>(query); // ~850ms 
    dt = Read2<SqlConnection, SqlDataAdapter>(query); // ~600ms 

    dt = Read1<VistaDBConnection>(query); // ~3900ms 
    dt = Read2<VistaDBConnection, VistaDBDataAdapter>(query); // ~3700ms 
} 
sw.Stop(); 
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString()); 

Read1 आंखों पर बेहतर लग रहा है, लेकिन डेटा एडाप्टर बेहतर प्रदर्शन करती है (भ्रमित करने के लिए नहीं है कि एक डाटाबेस अन्य से बेहतर प्रदर्शन किया, प्रश्नों सभी विभिन्न थे)। हालांकि दोनों के बीच का अंतर क्वेरी पर निर्भर था। कारण यह हो सकता है कि Load पंक्तियों को जोड़ने के दौरान पंक्तियों को from the documentation द्वारा पंक्तियों की जांच करने की आवश्यकता है (DataTable पर इसकी एक विधि) जबकि Fill डेटाएडाप्टर पर है जो केवल इसके लिए डिज़ाइन किए गए थे - डेटाटेबल्स की तेज़ रचना।

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