लिंक से एसक्यूएल: ऑप्टिमाइज़ेशन का चयन करें

एमएसएसक्यूएल में बड़ी टेबल पर; विशिष्ट स्तंभों का चयन क्वेरी की अधिक गति में परिणाम। क्या यह लिंक से एसक्यूएल पर भी लागू होता है?

क्या यह होगा:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

इससे तेज हो:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select p;

...

6

6 उत्तर

मैं अत्यधिक LinqPad की अनुशंसा करता हूं। यह मुफ़्त है और आपको LINQ क्वेरी को गतिशील रूप से चलाने देता है। जब आप जेनरेट किए गए एसक्यूएल को भी देख सकते हैं।

आप देखेंगे कि LINQ क्वेरी पहली क्वेरी को केवल उन स्तंभों को चुनने के लिए अनुवाद करेगी। तो यह तेज़ है।

6
जोड़ा

यदि आप केवल कुछ विशिष्ट कॉलम चुनकर परिणाम सेट के आकार को सीमित कर रहे हैं, तो हाँ इसका असर होगा।

EDIT ading clarification from comment

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

यह इस तथ्य के कारण है कि अंत में LINQ से SQL SQL उत्पन्न करता है, इसलिए समान प्रदर्शन लाभ मौजूद हैं।

4
जोड़ा
दोनों! SQL सर्वर तेजी से प्रतिक्रिया देगा, प्रेषित डेटा को सीमित कर देगा, और यह परिणाम युक्त संग्रह के आकार को कम करेगा, स्मृति को कम करेगा
जोड़ा लेखक Mitchel Sellers, स्रोत
स्मृति आवंटन की कमी में परिणाम? या अधिक गति?
जोड़ा लेखक roosteronacid, स्रोत

यहाँ "तेज" के साथ 3 पहलू हैं।

  1. संचारित कम डेटा का मतलब है और तेज। दूसरी तरफ यह होगा यह महत्वपूर्ण तेज़ नहीं मिलता है, जब तक आप एक से अधिक पंक्ति का चयन नहीं करते हैं या अगर आपके व्यक्ति में कुछ शामिल है अन्य "भारी" कॉलम - लंबा वर्कर्स, इमेज इत्यादि।
  2. जैसा कि जे। कुरान ने बताया, कम आवंटित स्मृति का मतलब तेज़ है। 1 में जैसा ही टिप्पणी है, यहां लागू होता है।

  3. आपकी क्वेरी तेज़ी से निष्पादित होती है यदि आप सभी में एक इंडेक्स है चयनित कॉलम (या SQL सर्वर 2005 से शुरू होने से जुड़ा हुआ)। इस मामले में SQL सर्वर इंजन को पंक्ति में पंक्ति के साथ पृष्ठ को लोड करने की आवश्यकता नहीं है - यदि यह अभी तक नहीं है।

व्यक्तिगत रूप से मैं इस तरह से अपने प्रश्नों को अनुकूलित करने की कोशिश नहीं करना चाहूंगा (जब तक कि मैंने कहा कि आपकी पंक्तियों में द्विआधारी डेटा या बहुत लंबे तार हैं जिनकी आपको आवश्यकता नहीं है), आंशिक रूप से क्योंकि यदि आप बाद में निर्णय लेते हैं कि आप और अधिक करना चाहते हैं इस चयनित व्यक्ति के बारे में जानकारी, आपको अपने डीबी एक्सेस कोड बनाम बदलना होगा। बस अपने पीओसीओ/अज्ञात वर्ग में किसी संपत्ति का उपयोग करना।

3
जोड़ा

इसके अतिरिक्त अन्य लोगों ने जो कहा है, नई अज्ञात संरचना व्यक्ति वस्तु की तुलना में बहुत हल्का वजन वस्तु होगी - यह बहुत तेज़ होगा, भले ही आपने सभी कॉलम चुने हों। (व्यक्ति के पास डेटाबेस को ऑब्जेक्ट को लिखने का समर्थन करने के लिए विधि/फ़ील्ड इत्यादि हैं। अनामित प्रकार नहीं है।)

1
जोड़ा

मुझे लगता है कि वही लागू होता है, क्योंकि LINQ से SQL SQL क्वेरी ऑपरेशंस को SQL कमांड में अनुवाद करता है।

1
जोड़ा

यदि आपके पास कॉलम हैं जो कि बाइनरी और छवियों जैसे बहुत बड़े हैं तो यह एक महत्वपूर्ण अंतर डाल सकता है, यही कारण है कि LINQ से SQL आपको कुछ कॉलम के लिए देरी लोडिंग निर्दिष्ट करने की अनुमति देता है ताकि आप अभी भी 'नई चुनिंदा' अनुमानों के बिना पूरी ऑब्जेक्ट्स का चयन कर सकें ।

1
जोड़ा