2010-06-25 12 views
5

मैंने हाल ही में दैनिक आधार पर LINQ का उपयोग करना शुरू कर दिया है। मैं पढ़ा है L2E प्रश्नों के बारे में काफी एक बहुत का उपयोग कर प्रदर्शन को बेहतर बनाने के लिए निम्न संकलित किया जाना चाहिए:LINQ से Entites 4.0 क्वेरी डिफ़ॉल्ट रूप से संकलित हैं?

CompiledQuery.Compile(query); 

का उपयोग LINQ-टू-संस्थाओं 4.0 मैं एक प्रश्न 10 बार uncompiled और फिर संकलित भाग गया और सामने आए निम्नलिखित परिणाम सेकंड में:

// Sample Query 
from u in ctx.Users orderby u.Id, u.Username select u 

Uncompiled Compiled 
--------------------- 
0.295  0.2946174 
0.024  0.0220462 
0.008  0.0060126 
0.013  0.0210441 
0.007  0.010021 
0.011  0.010021 
0.008  0.0060126 
0.009  0.0070147 
0.008  0.0060126 

जैसा कि आप देख सकते हैं कि मेरे छोटे परीक्षण से समय में कोई बड़ा अंतर नहीं है। पहली कॉल के लिए धीमा समय है, और फिर दोनों गति तेज (संकलन/कैशिंग का मतलब है)। क्या कोई इस बारे में अंतर्दृष्टि प्रदान कर सकता है?

+0

कुछ समय पहले यह शोध किया था और, afak (जो निश्चित रूप से निश्चित नहीं है) जवाब नहीं था। अगर मैं एक निश्चित उत्तर खोजने में सक्षम था तो मैं इसे यहां दूंगा, लेकिन मान लीजिए कि कोई भी नहीं करता है। – Will

+0

तो पहली बार क्या पूछताछ की जा रही है? – TheCloudlessSky

उत्तर

1

जो मैं एकत्र कर सकता हूं, उसके पास नामित पैरामीटर का उपयोग करके एसक्यूएल प्रश्नों के लिए एम्बेडेड पैरामीटर के साथ हार्ड-कोडित एसक्यूएल प्रश्नों के समान लाभ हैं: सिस्टम यह पहचान सकता है कि वे सभी समान हैं और एक ही क्वेरी योजना का उपयोग करते हैं।

उदाहरण के लिए, यदि आप उपर्युक्त अभिव्यक्ति को सरल रूप से रेखांकित करना चाहते हैं, तो यह संभवत: साथ ही साथ इसे संकलित करेगा यदि आप हमेशा ctx.Users ऑब्जेक्ट में गुजर रहे हैं। हालांकि, यदि आपके पास एक ही प्रकार के कई उपयोगकर्ता भंडार थे और उन सभी पर order by का उपयोग करने की योजना बना रहे थे, तो एक बार क्वेरी को संकलित करना और इसे एक्सेस करने के लिए पैरामीटर का उपयोग करना एक अच्छा विचार होगा।

इस पर शोध करते समय, मैंने देखा कि आईएल में एक LINQ क्वेरी कैसे बनाई गई है: एक नया Func<> प्रत्येक बार जब आप इसे कॉल करते हैं तो आपके LINQ क्वेरी में लगभग हर खंड के लिए प्रतिनिधि बनाया जाता है। अकेले उस कारण से, मुझे कल्पना है कि एक क्वेरी संकलित करना आपके सिस्टम के लिए बेहतर होगा जब तक कि स्मृति थ्रैशिंग हो जाए।

+0

हाँ मुझे एहसास हुआ कि SQL सर्वर स्पष्ट रूप से क्वेरी के कुछ कैशिंग कर रहा है क्योंकि अन-संकलित संस्करण में पहली बार क्वेरी चलाने के लिए समान प्रदर्शन समस्या होती है। आज मेरे घर की मशीन पर कुछ और परीक्षण करने के बाद, मैं देख सकता था कि औसत संकलित प्रश्नों पर मेरे पर्यावरण में 0.001 सेकेंड तेजी से चलते हैं। यह ज्यादा नहीं है, लेकिन दिलचस्प कोई भी कम नहीं है। – TheCloudlessSky

0

आप शायद संदर्भ का निपटारा नहीं कर रहे हैं। प्रश्नों को संदर्भ में कैश किया गया है, लेकिन उन्हें संकलित करने से आप उन्हें कई संदर्भों में उपयोग करने की अनुमति देते हैं। निश्चित रूप से कहना मुश्किल है क्योंकि आप वास्तव में अपना पूरा कोड नहीं दिखाते हैं।

+0

नहीं, यह एक विधि के अंदर 'उपयोग' कथन में लपेटा गया था जिसे बटन पर क्लिक किया गया था (मेरे पास कोड नहीं है लेकिन मुझे पता है कि मैं इसे निपटा रहा था)। – TheCloudlessSky

+0

यदि आप एक उत्तर चाहते हैं, तो आपको कोड पोस्ट करना होगा। –

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