2010-04-29 8 views
7

सारांश: हमें 12+ सेकंड के ईएफ 4 क्वेरी संकलन समय के साथ समस्याएं आ रही हैं। कैश किए गए प्रश्न हमें अभी तक प्राप्त करेंगे; क्या कोई तरीका है कि हम वास्तव में संकलन समय को कम कर सकते हैं? क्या कोई ऐसी चीज है जो हम गलत कर रहे हैं जिसे हम देख सकते हैं? धन्यवाद!एंटिटी फ्रेमवर्क 4 क्वेरी संकलन समय को कैसे कम करें?

हमारे पास एक ईएफ 4 मॉडल है जो डब्ल्यूसीएफ सेवाओं पर खुलासा हुआ है। हमारे प्रत्येक इकाई प्रकार के लिए हम कई संदर्भित बाल वस्तुओं सहित प्रदर्शन/संपादन के लिए पूरी इकाई को लाने और वापस लाने के लिए एक विधि का पर्दाफाश करते हैं।

एक विशेष इकाई के लिए हमें सभी प्रासंगिक डेटा वापस करने के लिए 31 टेबल/उप-टेबल शामिल करना होगा। दुर्भाग्यवश यह ईएफ क्वेरी संकलन को धीमा कर देता है: इसे 7,800-लाइन, 300K क्वेरी संकलित करने और बनाने के लिए 12-15 सेकंड लगते हैं। यह एक वेब यूआई का बैक एंड है जिसे उससे ज्यादा स्नैपियर करने की आवश्यकता होगी।

क्या कोई ऐसा करने के लिए हम क्या कर सकते हैं? हम CompiledQuery.Compile कर सकते हैं - यह पहले उपयोग तक कोई काम नहीं करता है और इसलिए दूसरे और बाद के निष्पादन में मदद करता है लेकिन हमारा ग्राहक परेशान है कि पहले उपयोग को धीमा नहीं होना चाहिए। इसी तरह यदि वेब सेवा की मेजबानी करने वाला आईआईएस ऐप पूल रीसाइक्लिंग हो जाता है तो हम कैश की योजना खो देंगे, हालांकि हम इसे कम करने के लिए जीवनकाल बढ़ा सकते हैं। इसके अलावा मैं समय से पहले और/या ईएफ संकलित क्वेरी कैश (प्रतिबिंब चाल से छोटा) को क्रमबद्ध करने का तरीका नहीं देख सकता। CompiledQuery ऑब्जेक्ट में केवल कैश में एक GUID संदर्भ होता है, इसलिए यह कैश है जिसे हम वास्तव में देखते हैं। (इसे लिखना यह मेरे लिए होता है, मैं उन्हें संकलित करने के लिए सभी प्रश्नों को निष्पादित करने के लिए app_startup से पृष्ठभूमि में कुछ लात मार सकता हूं - क्या यह सुरक्षित है?)

हालांकि अगर हम उस समस्या को हल करते हैं, तो भी हम अपनी खोज बनाते हैं LINQ-to-Entities खंडों के साथ गतिशील रूप से प्रश्नों के आधार पर हम किन पैरामीटर खोज रहे हैं: मुझे नहीं लगता कि एसक्यूएल जनरेटर एक अच्छा काम करता है कि हम सभी तर्क को SQL परत में स्थानांतरित कर सकते हैं, इसलिए मुझे नहीं लगता कि हम हमारे खोज प्रश्नों को पूर्व-संकलित कर सकते हैं। यह कम गंभीर है क्योंकि खोज डेटा परिणाम कम तालिकाओं का उपयोग करते हैं और इसलिए केवल 3-4 सेकंड संकलित 12-15 नहीं है लेकिन ग्राहक सोचता है कि अभी भी अंत उपयोगकर्ताओं के लिए वास्तव में स्वीकार्य नहीं होगा।

तो हमें वास्तव में किसी भी तरह क्वेरी संकलन समय को कम करने की आवश्यकता है। कोई विचार?

  • जगह शुरू करने के लिए के रूप में ELinqQueryState.GetExecutionPlan को अंक रूपरेखा और मुझे लगता है कि में लेकिन उपलब्ध वास्तविक .NET 4 स्रोत मैं बहुत दूर नहीं मिल सका बिना कदम का प्रयास किया है, और स्रोत परावर्तक द्वारा उत्पन्न जीता ' मुझे कुछ कार्यों में कदम रखने या उनमें ब्रेकपॉइंट सेट करने दें।
  • परियोजना को .NET 3.5 से अपग्रेड किया गया था, इसलिए मैंने ईएफएमएक्स को ईएफ 4 में स्क्रैच से पुन: उत्पन्न करने का प्रयास किया है, अगर इसमें कुछ गड़बड़ हो, लेकिन इससे मदद नहीं मिली।
  • मैंने यहां विज्ञापन की ईएफप्रोफ उपयोगिता की कोशिश की है, लेकिन ऐसा नहीं लगता है कि इससे इससे मदद मिलेगी। मेरी बड़ी क्वेरी वैसे भी अपने डेटा कलेक्टर को दुर्घटनाग्रस्त कर देती है।
  • मैंने एसक्यूएल प्रदर्शन ट्यूनिंग के माध्यम से जेनरेट की गई क्वेरी चलाई है और इसमें पहले से ही 100% इंडेक्स उपयोग है। मैं डेटाबेस के साथ कुछ भी गलत नहीं देख सकता जो क्वेरी जेनरेटर समस्याओं का कारण बनता है।
  • निष्पादन योजना कंपाइलर में कुछ ओ (एन^2) है - क्या यह सभी 32 टेबलों की बजाय अलग-अलग डेटा लोड के ब्लॉक में इसे तोड़ने में मदद कर रहा है? आलसी लोड को ईएफ सेट करने से मदद नहीं मिली।
  • मैंने प्री-रिलीज ओ'रेली जूली लर्मन ईएफ 4 पुस्तक खरीदी है लेकिन मुझे 'आपकी क्वेरी संकलित करने' से परे मदद करने के लिए वहां कुछ भी नहीं मिला है।

मुझे समझ नहीं आता क्यों यह 12-15 सेकंड ले रहा है उत्पन्न करने के लिए एक एकल 32 टेबल भर में चयन इसलिए मैं आशावादी हूँ वहाँ सुधार के लिए कुछ गुंजाइश है है!

किसी भी सुझाव के लिए धन्यवाद! आरटीएम वीएस -2010 का उपयोग करते हुए हम मामले और XP/7/सर्वर 2008 R2 के मामले में SQL Server 2008 के विरुद्ध चल रहे हैं।

+0

हमारे पास यह समस्या भी है, और यह एक बड़ी समस्या है। प्रश्नों को निष्पादित करने का समय सबसे अधिक 2-300 एमएस पर है, जबकि ELinqQueryState.GetExecutionPlan() के लिए प्रतीक्षा 8-9 सेकंड लेता है। और यह हमारे बड़े उत्सुक लोड प्रश्नों को विभाजित करने के बाद है जो ईएफ संभाल नहीं सकता है (प्रत्येक qry के लिए ELinqQueryState.GetExecutionPlan() के लिए 2-4 मिनट का उपयोग करने के लिए उपयोग किया जाता है) कई अधिक सरल उत्सुक लोड क्वेरी में। मुझे लगता है कि हम जो भी कर सकते हैं वह ईएफ 5 की प्रतीक्षा है जो इसके कारण कुछ दर्द से छुटकारा पाने वाला है। – Mahol25

+0

मैंने इस मुद्दे के बारे में msdn.forums पर पोस्ट किया है ताकि इस पर कुछ मार्गदर्शन प्राप्त हो सके, यहां थ्रेड करें http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/055c5b55-2d2a-4298- a28c-32737c57ad8d – Mahol25

+0

@ Mahol25 धन्यवाद - मैं उस धागे को देखूंगा। मुझे खेद है कि प्रोजेक्ट छोड़ने से पहले हमें कभी भी हमारे प्रश्नों को एक सेकंड से नीचे नहीं मिला है, इसलिए मेरे पास पहले से मौजूद कुछ भी देने के लिए कोई ठोस सुझाव नहीं है। – Rup

उत्तर

7

अपने प्रश्नों को सरल बनाएं। गंभीरता से; क्वेरी जटिलता और संकलन समय के बीच लगभग रैखिक संबंध है। दो सरल प्रश्न अक्सर एक जटिल क्वेरी से कहीं अधिक तेज़ होते हैं (भले ही प्रीकंपिल्ड हो!)। यदि गति अंतिम लक्ष्य है, तो सबसे तेज़ विकल्प चुनें।

+0

धन्यवाद, और इस पर वापस आने के लिए उम्र लेने के लिए खेद है। हां, यही वह है जिसे हमने रीड-फॉर-डिस्प्ले मामलों के लिए कम या कम करने के लिए समाप्त कर दिया है: ब्रेकिंग ऑब्जेक्ट प्रत्येक के लिए प्रीकंपील्ड प्रश्नों के साथ कई छोटे हिस्सों में लोड होता है और उसके बाद हम जो पीओसीओ ऑब्जेक्ट्स में पुनर्प्राप्त डेटा को पुनः संयोजित करते हैं डेटा परिवहन सुरक्षा के लिए हम संयुक्त परिणाम ऑब्जेक्ट के लिए ईएफ डेटा को एकसाथ सिलाई करने की कोशिश करने के बजाय पढ़ने-के-अद्यतन मामलों के लिए एकल बड़े प्रश्नों पर फंस गए हैं। – Rup

+1

नाइट-पिक: रैखिक संबंध का मतलब यह होगा कि इसे विभाजित करने से कोई लाभ नहीं मिलेगा, और उच्च प्रति-क्वेरी निरंतर होने के कारण इसे चोट पहुंच सकती है। –

+1

@ MerlynMorgan-ग्राहम, लक्ष्य सरल और समकक्ष प्रश्नों की एक जोड़ी (या अधिक) चुनना है, न केवल जटिलता को आधे में विभाजित करना है। –

1

यह संभवतः वह उत्तर नहीं है जिसे आप ढूंढ रहे हैं, लेकिन एक सरल कामकाज के लिए आप CompiledQuery.Compile क्यों नहीं चलाते हैं जब वेबपैप प्रारंभ होता है (वेबपैड पर कुछ डमी कॉल करें) (ग्राहक) कॉल करें।

+0

धन्यवाद। हां, यह उपलब्ध कराने के लायक है कि मैं इसे पृष्ठभूमि में कर सकता हूं - मैं एप पूल पुनरारंभ होने पर हर बार सभी प्रश्नों को संकलित करने के लिए साइट को लॉक नहीं करना चाहता हूं। हालांकि यह हमारे खोज प्रश्नों को तेज़ी से बढ़ाने में मदद नहीं करेगा, जिसे हम फ्लाई पर बनाते हैं और इसलिए जहां तक ​​मैं देख सकता हूं कैश नहीं कर सकता। (CompiledQuery.Compile कॉल वास्तव में क्वेरी को कैश GUID के साथ जोड़ता है और तुरंत लौटाता है - यह तब तक नहीं है जब संकलन वास्तव में होता है। इसलिए मुझे स्टार्ट-अप पर प्रत्येक संकलित क्वेरी पर एक डमी फ़ेच करना होगा संकलन ट्रिगर करने के लिए।) – Rup

+0

हमने इसे ऐप इनिट पर पृष्ठभूमि थ्रेड के रूप में कार्यान्वित किया है और यह हमेशा दुर्भाग्य से काम नहीं करता है; यह एकल-थ्रेड मामले में ठीक काम करता है और ईएफ 4 कैशिंग कोड में कोई थ्रेड-निर्भरता नहीं है, इसलिए मुझे कुछ नुकसान होता है क्योंकि यह हमेशा काम क्यों नहीं करता है। हालांकि यह कुछ मामलों में मदद करता है इसलिए हम इसके साथ अटक गए हैं। सलाह के लिये धन्यवाद! – Rup

4

आप अपने कुछ जटिल प्रश्नों के लिए एक दृश्य बना सकते हैं जो आपको SQL का पूरा नियंत्रण देता है। फिर उस डेटा को अपने डेटा मॉडल में शामिल करें।

+0

धन्यवाद, और इस पर वापस आने के लिए उम्र लेने के लिए खेद है। हां, हमने कुछ पढ़ने-योग्य प्रश्नों (खोज परिणाम इत्यादि) के लिए विचार तैयार किए हैं, लेकिन हम सामान्य ऑब्जेक्ट फ़ेच के लिए ऑब्जेक्ट पेड़ बनाने के लिए अटक गए हैं। – Rup

1

आप http://www.iis.net/download/ApplicationWarmup का उपयोग करने का प्रयास कर सकते हैं यह बीटा में है, लेकिन हम इसका उपयोग करने के संबंध में भी हैं।

+0

सुझाव के लिए धन्यवाद, और इस पर वापस आने के लिए उम्र लेने के लिए खेद है। शक्तियों ने कहा है कि कम से कम नहीं, जबकि यह अभी भी बीटा है, इसलिए हमने पृष्ठभूमि धागे में कुछ ऐसा करने को समाप्त कर दिया है - दुर्भाग्यवश सीमित सफलता के साथ: - – Rup

1

nqueries पर एक नज़र डालें, यह प्रीकंपील्ड प्रश्नों का उपयोग करता है, जो एप्लिकेशन स्टार्टअप के दौरान उत्पन्न होते हैं।

संपादित करें: EF5 करने के लिए स्विच के बाद से, NQueries करता नहीं रह गया है संकलित प्रश्नों का समर्थन के रूप में यह DbContext का प्रयोग किया, अगर आप अभी भी है जो अभी भी आधारित ObjectContext और संकलित प्रश्नों का समर्थन करता है देखने के लिए, 1.03 release source code लेते हैं, चाहते हैं।

+0

धन्यवाद। मैं एक नज़र रखूंगा, लेकिन हम पहले से ही संकलित क्वेरीज तैयार कर रहे हैं और जहां तक ​​हम कर सकते हैं प्रीकंपिल्ड दृश्यों का उपयोग कर रहे हैं - मैं नहीं देख सकता कि स्टार्टअप पर यह और क्या कर सकता है। – Rup

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