2011-10-19 14 views
5

मुझे एंटीटी फ्रेमवर्क के साथ काम करने के कुछ महीने का अनुभव मिला है और ज्यादातर इसके खिलाफ डेटा पुनर्प्राप्ति linq प्रश्नों का एक टन लिख रहा है। मैं एक भारी एसक्यूएल पृष्ठभूमि से आया हूं, और यदि मैं प्रदर्शन समस्याओं को डीबग करने की कोशिश कर रहा हूं तो प्रदर्शन और पठनीयता के लिए कुछ एसक्यूएल अनुकूलित करने की कोशिश कर रहा हूं।इकाई फ्रेमवर्क क्वेरी ऑप्टिमाइज़ेशन

मैं उत्पन्न एसक्यूएल के कुछ देख रहा हूँ मैं इसे कैसे इन बेकार व्युत्पन्न तालिकाओं करने से रोकूँ कॉलम के साथ एक TableA {col1, col2, col3}

select 
    Extent1.col1 
from 
(
    select col1, col2, col3 from tableA 
) AS Extent1 

मेरे सवाल है, के लिए इस तरह काम करता है , और इसके बजाय बस

select col1 from tableA 

जहां इसकी आवश्यकता है? मुझे यह पता लगाना प्रतीत नहीं होता है कि यह कभी-कभी ऐसा क्यों करता है और अन्य बार यह नहीं करता ...

+0

मुझे अन्य लोगों के विचारों को सुनने में रूचि है; लेकिन मुझे लगता है कि यह ईएफ (साथ ही साथ अन्य ओआरएम?) का उपयोग करने के ड्रॉ बैक में से एक है। उत्पन्न होने वाले वास्तविक एसक्यूएल पर आप बहुत अधिक नियंत्रण खो देते हैं, और जेनरेटेड एसक्यूएल अक्सर बहुत खराब होता है। – CodingGorilla

+0

संभावित ढलान [इकाई ढांचे से उत्पन्न क्वेरी में सुधार] [http://stackoverflow.com/questions/7418675/improve-query-generated-from-entity-framework) –

उत्तर

4

क्या आपने जेनरेट की गई क्वेरी की वास्तविक क्वेरी निष्पादन योजनाओं की तुलना की है कि आप इसे कैसे अनुकूलित करेंगे? आप परिणामों पर आश्चर्यचकित हो सकते हैं, मुझे पता है कि मैं था। और मुझे एसक्यूएल सर्वर टीम पर देवताओं के लिए गहरा सम्मान मिला, जो उप-इष्टतम क्वेरी की तरह दिखने के लिए काफी उत्कृष्ट काम कर रहे हैं।

यदि आपका अनुभव मेरा से अलग है तो मुझे सुनने में दिलचस्पी होगी; मैंने जेनरेट किए गए प्रश्नों को बदलने के तरीकों की तलाश करना बंद कर दिया क्योंकि प्रत्येक क्वेरी के लिए मैंने कोशिश की, प्रदर्शन में कोई वास्तविक अंतर नहीं था।

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

+0

हाय जोएल, सामान्य रूप से आप सही हैं, लेकिन मेरे पास है कुछ वास्तविक ग़लत प्रश्न जो 300 लाइन लंबी हैं जो पूरे "पूरे" बेकार व्युत्पन्न टेबल "व्यवसाय करते हैं। उस क्वेरी को लेना और तालिका समकक्ष से अपने बाद के प्रत्यक्ष चयन के साथ व्युत्पन्न तालिकाओं को प्रतिस्थापित करना, उस तरह की एक बड़ी क्वेरी 7 सेकंड से नीचे 1 सेकंड तक लेता है .... इसलिए मैं आपके साथ सबसे अधिक भाग के लिए सहमत हूं, लेकिन आंकड़े लगाने की कोशिश कर रहा हूं मैं अपने लिनक्स को बेहतर तरीके से कैसे अनुकूलित कर सकता हूं ताकि मैं इस मुद्दे में भाग न सकूं। – Zom

+0

@ इसामु: आम तौर पर यदि आप अपनी LINQ क्वेरी को सरल बना सकते हैं, तो एसक्यूएल भी आसान हो जाता है। ऐसा करने के लिए बहुत सारी तकनीकें हैं, लेकिन बिना किसी कोड के पहले स्थान पर देखने के लिए, विशिष्ट सलाह देना मुश्किल है। क्या> 7x प्रदर्शन लाभ आप ईएफ-जेनरेट कोड से अनावश्यक कॉलम को हटाने के प्रत्यक्ष परिणाम के रूप में रिपोर्ट कर रहे हैं, या आप अधिक जटिल परिवर्तन कर रहे हैं? – StriplingWarrior

+1

मुझे लगता है कि आपने प्रदर्शन अंतर का परीक्षण करते समय क्वेरी कैशिंग के लिए जिम्मेदार ठहराया है ... ईएफ टीम ब्लॉग पर एक ब्लॉग पोस्ट है (http://blogs.msdn.com/b/adonet/archive/2011/07/ 25/जेनरेट-एसक्यूएल-सुधार-के लिए-tpt-query.aspx) जेनरेट एसक्यूएल के प्रदर्शन सुधार से संबंधित विशिष्ट मुद्दों पर प्रतिक्रिया के लिए खुला है। सबसे हालिया रिलीज में टेबल-प्रति-प्रकार वर्ग विरासत पदानुक्रम से निपटने के दौरान किए गए सुधारों के बारे में वह विशिष्ट पोस्ट वार्तालाप करता है। –

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