2013-05-06 5 views
7

मैं अपनी डेटा एक्सेस परत पर एंटीटी फ्रेमवर्क 5, ऑब्जेक्ट कॉन्टेक्स्ट और पीओसीओ का उपयोग कर रहा हूं। मेरे पास एक सामान्य श्वसन कार्यान्वयन है और मेरे पास एक तरीका है जो छोड़कर() और टेक() का उपयोग करके पेजिंग के साथ डेटाबेस से पूछताछ करता है। सब कुछ ठीक काम करता है, सिवाय इसके कि क्वेरी प्रदर्शन बहुत धीमी है जब बहुत सी पंक्तियाँ (मैं 170k के बारे में बात कर रहा हूँ पंक्तियों)इकाई फ्रेमवर्क छोड़ने की विधि बहुत धीमी गति से चल रही है

यह संस्थाओं के लिए LINQ पर अपनी क्वेरी का एक अंश है लंघन:

सी # कोड :

ObjectContext oc = TheOBJEntitiesFactory.CreateOBJEntitiesContext(connection); 
var idPred = oc.CreateObjectSet<view_Trans>("view_Trans").AsQueryable(); 
idPred = idPred.OrderBy(sortColumn, sortDirection.ToLower().Equals("desc")); 
var result = idPred.Skip(iDisplayStart).Take(iDisplayLength); 
return new PagedResult<view_Trans>(result, totalRecords); 

अनुवाद क्वेरी में लेन-देन-एसक्यूएल को मैंने देखा है कि बजाय ROW_NUMBER() दृश्य सीधे अपने एक उप क्वेरी बनाने और ROW_NUMBER लागू करने के क्लॉज() का उपयोग करने का उप क्वेरी के परिणामों ... को

उदाहरण:

select top(10) extent1.A, extent1.B.extent1.C from (
select extent1.A, extent1.B, extent1.C, 
row_number() OVER (ORDER BY [Extent1].[A] DESC) AS [row_number] 
from (
select A,B,C from table as extent1)) as extent1 
WHERE [Extent1].[row_number] > 176610 
ORDER BY [Extent1].[A] DESC 

इसे पूरा होने में लगभग 165 सेकंड लेता है। अनुवादित क्वेरी कथन के प्रदर्शन को बेहतर बनाने के बारे में कोई विचार?

+2

चूंकि प्रश्न छोड़ने के बिना तेज़ है, यह सुझाव देता है कि समस्या एंटिटी फ्रेमवर्क में प्रदर्शन विचार के अन्य क्षेत्रों की बजाय एसक्यूएल में है। इसलिए, पहली बात यह है कि मैं क्वेरी का धीमा होने का निदान करने के लिए एसक्यूएल प्रोफाइलर का उपयोग करना चाहता हूं। क्या आपने यह कोशिश की है? आपको क्या मिला? –

+0

मैंने पहले ही ऐसा किया है। मुझे लगता है कि समस्या अनावश्यक सबक्वायरी में है जिसका निर्माण एंटिटी फ्रेमवर्क द्वारा किया जा रहा है, जब मैं एंटीटी फ्रेमवर्क के बजाय लिंकक्टोस्क्ल का उपयोग करके एक ही क्वेरी करता हूं तो परिणाम समान नहीं होता है और क्वेरी बहुत तेज (~ 30 सेकंड) होती है। यदि आप ऊपर दिए गए उदाहरण में एसक्यूएल देखते हैं, तो तालिका में एक अनावश्यक उप-क्वेरी है और पंक्ति_number तालिका पर लागू नहीं है, लेकिन उस उप-क्वेरी के परिणामों के लिए। – Boanerge

+0

यह वास्तव में मेरे प्रश्न का उत्तर नहीं देता है। आपके द्वारा दोषित उप-समूह कई ईएफ प्रश्नों में प्रकट होता है जो पूर्ण होने के लिए 165 नहीं लेते हैं। एसक्यूएल प्रोफाइलर आपको अधिक विशिष्ट जानकारी देना चाहिए। क्या, ठीक है, 165s का कारण बन रहा है? –

उत्तर

0

धीमेपन का एक कारण शायद यह है कि आपका वर्ग आपकी पंक्तियों को दो बार आदेश दे रहा है।

क्वेरी को नियंत्रित करने के लिए, मुझे पता है कि एकमात्र विकल्प idPred.SqlQuery ("चयन करें ...", पैराम्स को कॉल करना है)। यह आपको डेटा अनुरोध के लिए अपनी अनुकूलित क्वेरी लिखने की अनुमति देगा।

+2

यदि आप मुझे वोट देने जा रहे हैं, तो क्या आप मुझे यह बताने के लिए टिप्पणी कर सकते हैं कि मेरे उत्तर में क्या गलत है? –

1

उन लोगों के लिए जो ऊपर दिए गए टिप्पणियों का पालन नहीं करते हैं, मुझे संदेह है कि समस्या अतिरिक्त SELECT नहीं थी, क्योंकि अतिरिक्त SELECT कई ईएफ प्रश्नों पर मौजूद है जो 165 रनों को चलाने में नहीं लेते हैं। मैंने अंततः देखा कि उनके ऑब्जेक्टसेट ने VIEW का संदर्भ दिया और आश्चर्य किया कि क्या यह समस्या का हिस्सा हो सकता है। कुछ प्रयोगों के बाद, उन्होंने इस समस्या को दृश्य के अंदर LEFT JOIN तक सीमित कर दिया। मैंने सुझाव दिया कि वह उस क्वेरी पर डेटाबेस ट्यूनिंग सलाहकार चला गया; उसने किया, और दो सूचकांक ने समस्या को हल करने का सुझाव दिया।

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