2012-12-18 16 views
5

मेरे पास 200,000 रिकॉर्ड की एक तालिका है जहां मुझे केवल .Take() का उपयोग करके शीर्ष 10 मिल रहा है लेकिन डेटा प्राप्त करने में लगभग 10 सेकंड लग रहे हैं।लिंक से इकाइयों का उपयोग बहुत धीमा है। टेक() विधि

मेरा प्रश्न है: क्या .Take() विधि डेटाबेस से सभी डेटा प्राप्त करता है और क्लाइंट पक्ष पर शीर्ष 10 फ़िल्टर करता है?

mylist = (from mytable in db.spdata().OrderByDescending(f => f.Weight) 
            group feed by mytable.id into g 
            select g.FirstOrDefault()).Take(10).ToList(); 

spdata() संग्रहीत प्रक्रिया से एक समारोह के आयात है:

यहाँ मेरी कोड है।

धन्यवाद

+7

आप उत्सुक क्या यह डेटाबेस के खिलाफ चलाता है आप एक प्रोफाइलर हुक चाहिए रहे हैं अपने डीबी तक और लॉग की जांच करें, यह पता लगाने का सबसे अच्छा तरीका है। – Chris

+1

यदि spdata() 200,000 लौटाता है तो हाँ, यह क्लाइंट पक्ष पर करेगा। –

+0

क्रिस 'विधि के अलावा, आप लिंककैड को भी आजमा सकते हैं और उत्पन्न क्वेरी को देखने के लिए अपनी क्वेरी लिखने के बाद एसक्यूएल व्यू पर स्विच कर सकते हैं, या ब्रेकपॉइंट डाल सकते हैं (इस विधि के साथ http://stackoverflow.com/questions/1412863/how कार्यक्रम-निष्पादन के रूप में जेनरेट किया गया है यह देखने के लिए -do-i-view-the-sql-gener-by-the-entity-framework)। –

उत्तर

8

संग्रहीत प्रक्रिया संभवतः क्लाइंट को बहुत अधिक डेटा देता है जो बहुत धीमी है। आप एक स्पोक को एक क्वेरी रिमोट नहीं कर सकते हैं। दृश्य या तालिका-मूल्यवान फ़ंक्शन का उपयोग करना संभव होगा।

किसी प्रश्न में एक स्पोक का उपयोग करने का कोई तरीका नहीं है। आप इसे केवल अपने आप ही निष्पादित कर सकते हैं।

आपका इरादा शायद सर्वर पर Take(10) निष्पादित करना था। इसके लिए आपको एक इनलाइन क्वेरी, व्यू या टीवीएफ पर स्विच करने की आवश्यकता है।

6

विस्तार विधि Take करता डेटाबेस से सभी परिणाम प्राप्त नहीं की जा। यह नहीं है कि Take काम करता है।

हालांकि आपकी db.spdata() कॉल शायद सभी पंक्तियां लाती है।

1

मैं 100% यकीन नहीं है, लेकिन जैसा कि मुझे याद है आप एक IEnumerable परिणाम प्राप्त जब आप एक सपा एफई DataContext का उपयोग कर फोन ...

प्रदर्शन का अनुकूलन करने के लिए था के एक जोड़े हैं:

  • एसपी पैरा के रूप में खोज मानदंड पास करें और संग्रहीत प्रक्रिया में फ़िल्टरिंग करें।

या आप में सपा जहां आप किसी भी चर की घोषणा नहीं कर रहे हैं और जहाँ आप बस कुछ टेबल तो शामिल हो रहे हैं एक काफी सरल प्रश्न पूछना चाहते हैं तो:

  • जहां क्वेरी को निर्दिष्ट एक अनुक्रमित दृश्य बनाएं कि आप उस पर टेक विधि की आवश्यकता है और उसे कॉल करें।
    यह आपको क्या देगा? आप बनाए गए दृश्य पर मानचित्र कर सकते हैं और ईएफ अब एक IQueryable परिणाम लौटाएगा और एक आईनेमरेबल नहीं होगा। यह एसक्यूएल कमांड को अनुकूलित करेगा और इसके बजाय सभी डेटा प्राप्त करेगा और फिर आपको आवश्यक 10 तत्वों को ले जाएगा, एक एसक्यूएल कमांड जो केवल 10 तत्वों को पुनर्प्राप्त करेगा।

मैं यह भी सलाह देता हूं कि IENumerable बनाम IQueryable के बीच क्या अंतर है।

0

ऐसा करता है, क्योंकि आप समूह से पहले डेटा को सॉर्ट कर रहे हैं, जो एसक्यूएल में करना संभव नहीं है।

आप वजन तो प्रत्येक समूह से उच्चतम वजन प्राप्त करने के लिए, एक समग्र का उपयोग करना चाहिए सॉर्ट पाने के लिए दस सबसे बड़े:

mylist = (
    from mytable in db.spdata() 
    group feed by mytable.id into g 
    select g.Max(f => f.Weight) 
).OrderByDescending(w => w).Take(10).ToList(); 
+0

यह एक त्रुटि दे रहा है त्रुटि "इस क्षेत्र में 'जी' नामक एक स्थानीय चर घोषित नहीं किया जा सकता है क्योंकि यह 'जी' के लिए एक अलग अर्थ देगा, जिसका उपयोग पहले से ही 'माता-पिता या वर्तमान' दायरे में कुछ और करने के लिए किया जाता है" –

+0

@AliIssa: ठीक है, यह एक अलग चर होना है। मैंने इसे बदल दिया। – Guffa

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