2010-05-14 11 views
27

नीचे कोड को ध्यान में रखते:DataView.RowFilter बनाम DataTable.Select() बनाम DataTable.Rows.Find()

Dataview someView = new DataView(sometable) 
someView.RowFilter = someFilter; 

if(someView.count > 0) { …. } 

काफी लेख जो Datatable.Select (कहते हैं कि के एक नंबर) DataViews का उपयोग कर से बेहतर है, लेकिन ये वीएस -2008 से पहले हैं।

Solved: The Mystery of DataView's Poor Performance with Large Recordsets
Array of DataRecord vs. DataView: A Dramatic Difference in Performance

इस विषय मैं कुछ लेख/मंच विषयों जो Datatable.Select उल्लेख पाया पर Googling() अपने आप में काफी गाड़ी (इस पर यकीन नहीं) है और विभिन्न स्थितियों में खराब प्रदर्शन करता है।

इस (Best Practices ADO.NET) यह MSDN पर विषय पर सुझाव दिया है कि अगर वहाँ प्राथमिक कुंजी findrows() एक datatable या लगता है पर परिभाषित() है तरीकों Datatable.Select के insted इस्तेमाल किया जाना चाहिए()।

यह आलेख here (.NET 1.1) सभी तीन दृष्टिकोणों के साथ-साथ कुछ और बेंचमार्क करता है। लेकिन यह संस्करण 1.1 के लिए है इसलिए सुनिश्चित नहीं है कि ये अभी भी वैध हैं या नहीं। इस DataRowCollection.Find() के लिए accroding सभी दृष्टिकोण और डेटाटेबल से बेहतर प्रदर्शन करता है। चयन करें() DataView.RowFilter से बेहतर प्रदर्शन।

तो मैं काफी हद तक उलझन में हूं कि डेटाटेबल में पंक्तियों को खोजने के लिए सबसे अच्छा तरीका क्या हो सकता है। या ऐसा करने का कोई भी अच्छा तरीका नहीं है, परिदृश्य के आधार पर कई समाधान मौजूद हैं?

+0

इनाम के लिए धन्यवाद! – thmshd

उत्तर

45

आप "एक datatable में पंक्तियों खोजने पर सबसे अच्छा तरीका" के लिए देख रहे हैं, तो मैं पहले पूछने के लिए: "सर्वश्रेष्ठ" किस लिए? मुझे लगता है, किसी भी तकनीक में परिदृश्य हैं जहां यह दूसरों के लिए बेहतर फिट हो सकता है।

सबसे पहले, DataView.RowFilter देखें: डेटाव्यू के डेटा बाइंडिंग में कुछ फायदे हैं। इसकी बहुत दृश्य-उन्मुख है, इसलिए इसमें शक्तिशाली सॉर्टिंग, फ़िल्टरिंग या फीचर्स हैं, लेकिन कुछ ओवरहेड बनाता है और प्रदर्शन के लिए अनुकूलित नहीं है। मैं छोटे recordsets के लिए DataView.RowFilter का चयन करेंगे और/या जहां अन्य सुविधाओं (जैसे, एक प्रत्यक्ष डेटा दृश्य के लिए बाध्य) का लाभ लेने के।

DataView, जो आप पुराने पोस्ट में पढ़ सकते हैं के बारे में अधिकांश तथ्यों, अभी भी लागू होते हैं।

दूसरा, आपको DataTable.Select से अधिक होना चाहिए यदि आप केवल एक ही हिट चाहते हैं। क्यूं कर? DataTable.Rows.Find केवल एक पंक्ति देता है। अनिवार्य रूप से, जब आप प्राथमिक कुंजी निर्दिष्ट करते हैं, तो एक बाइनरी पेड़ बनाया जाता है। इसके साथ कुछ ओवरहेड जुड़ा हुआ है, लेकिन पुनर्प्राप्ति को काफी हद तक गति देता है।

DataTable.Select धीमा है, लेकिन यदि आपके पास एकाधिक मानदंड हैं और अनुक्रमित या अनइंडेक्ड पंक्तियों की परवाह नहीं करते हैं तो यह बहुत आसान हो सकता है: यह मूल रूप से सबकुछ पा सकता है लेकिन प्रदर्शन के लिए अनुकूलित नहीं है। अनिवार्य रूप से, DataTable.Select पूरे तालिका चलना और मानदंड है कि आप में।

पारित कर मुझे आशा है कि आप इस छोटे सिंहावलोकन उपयोगी पाते लिए हर रिकॉर्ड तुलना करने के लिए है।

मैं this article पर एक नज़र लेने के लिए सुझाव देंगे, यह प्रदर्शन प्रश्नों के बारे में मेरे लिए मददगार था। इस पोस्ट से कुछ उद्धरण शामिल हैं।

एक छोटी सी अद्यतन: वैसे, इससे आपके प्रश्न का के दायरे से बाहर एक छोटे से लग सकता है लेकिन इसके लगभग हमेशा सबसे तेजी से समाधान छानने और बैकएंड पर खोज कर क्या करना है।यदि आप सादगी चाहते हैं और SQL सर्वर बैकएंड और क्लाइंट पर .NET3 + के रूप में हैं, तो LINQ-to-SQL के लिए जाएं। लिंक ऑब्जेक्ट्स खोजना बहुत ही आरामदायक है और सर्वर पक्ष पर किए गए प्रश्न बनाता है। जबकि LINQ-to-Objects भी एक बहुत ही आरामदायक लेकिन धीमी तकनीक भी है। मामले में आप पहले से ही पता था कि नहीं ....

+0

मुझे अभी एक ऐसा मामला मिला जहां परिणाम और चयन के बीच अलग-अलग थे। चयन और रोफिल्टर तकनीकें। मेरे मामले में 532 पंक्तियां लौटाएं और रोफिल्टर 540 लौट रहा था। मुझे तालिका डेटा में अतिरिक्त रिक्त स्थान से संबंधित अंतर मिला, और इसे चुनिंदा कथन में ट्रिम का उपयोग करके हल किया गया TRIM (विक्रेता संख्या) = '500' – James

20

Thomashaid पद यह अच्छी तरह का सार:

  • DataView.RowFilter बंधन के लिए है।
  • DataTable.Rows.Find प्राथमिक कुंजी केवल द्वारा खोज के लिए है।
  • DataTable.Select कई स्तंभों के लिए और ऑर्डर निर्दिष्ट करने के लिए भी है।

लूप में कई डेटा व्यू बनाने और रिकॉर्ड खोजने के लिए अपने RowFilters का उपयोग करने से बचें। यह प्रदर्शन को काफी कम करेगा।

मैं जोड़ना चाहता था कि DataTable.Select इंडेक्स का लाभ उठा सकता है। तब

DataView dv = new DataView(dt); 
dv.Sort = "Col1, Col2"; 

, जब आप DataTable.Select() कहते हैं, यह जब क्वेरी चलाने इस सूचकांक का उपयोग कर सकते: आप एक DataView बनाने और सॉर्ट क्रम निर्दिष्ट करने के द्वारा एक DataTable पर एक सूचकांक बना सकते हैं। हमने इस तकनीक का उपयोग उन स्थानों पर प्रदर्शन को गंभीरता से सुधारने के लिए किया है जहां हम कई बार कई प्रश्नों का उपयोग करते हैं। (ध्यान दें कि यह लिंक मौजूद होने से पहले था।)

चाल Select कथन के लिए क्रमबद्ध क्रम को परिभाषित करना है। तो यदि आपकी क्वेरी "Col1 = 1 और Col2 = 4" है, तो आप ऊपर दिए गए उदाहरण में "Col1, Col2" चाहते हैं।

ध्यान दें कि इंडेक्स निर्माण डेटाव्यू बनाने के लिए वास्तविक कॉल पर निर्भर हो सकता है। हमें new DataView(DataTable dt) कन्स्ट्रक्टर का उपयोग करना था, और उसके बाद सॉर्ट प्रॉपर्टी को एक अलग चरण में निर्दिष्ट करना था। व्यवहार अलग .NET संस्करणों के साथ थोड़ा बदल सकता है।

+1

यह कौन है सुपर आसान मुझे विश्वास नहीं है कि यह एमएसडीएन पर दस्तावेज नहीं है। कोड की 1 पंक्ति की तरह, मैंने अपने डेटाटेबल के प्रदर्शन में काफी सुधार किया है। सभी मूर्खतापूर्ण FindRows() और शब्दकोश काम करने के बिना चयन() कॉल करें। धन्यवाद –

+1

सुपर, जिसने मेरा दिन बनाया। अब प्रश्न 300% तेज हैं! – JohanLarsson

+1

यदि आप अंतर्निहित .NET स्रोत से कदम उठाते हैं, तो आप अक्सर देखेंगे। यदि चयन सही है, तो चयन करें() एक इंडेक्स स्वयं बना देता है। जैसे कि "col1 = 3 और col2 = 4" जैसी सरल अभिव्यक्ति का उपयोग किया जाता है। आप चयन के बाद तालिका के निजी [इंडेक्स] फ़ील्ड की जांच करके इसे देख सकते हैं। उन मामलों में डेटाव्यू बनाने की कोई आवश्यकता नहीं है। उपर्युक्त उत्तर भी मेरे लिए काम नहीं करता है, मुझे केवल टेबल कन्स्ट्रक्टर के साथ डेटाव्यू बनाने की आवश्यकता है, और फिर [सॉर्ट] संपत्ति को अलग से सेट करें। सुनिश्चित नहीं है कि क्यों ... – LMK

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