6

मेरे पास काफी सरल क्वेरी है जो बहुत धीमी है। इकाई फ्रेमवर्क प्रोफाइलर का कहना है कि इसमें लगभग 100 एमएस लगते हैं।मेरी इकाई फ्रेमवर्क क्वेरी धीमी गति से क्यों है?

dbContext.Users.Single(u => u.Id == userId); 

थोड़ा सा प्रयास करने के बाद मुझे एक प्रश्न मिला जो बहुत समान है लेकिन बहुत तेज़ (लगभग 3 एमएस) है।

dbContext.Users.Where(u => u.Id == userId).ToList().Single(); 

जब मैं दो प्रश्नों के एसक्यूएल की तुलना करता हूं तो दूसरी क्वेरी नेस्टेड चयन का उपयोग नहीं करती है और कोई शीर्ष ऑपरेशन नहीं होता है। लेकिन मैं इन दो चीजों के कारण 30 गुना तेजी से उम्मीद नहीं करूँगा। साथ ही SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर क्वेरी निष्पादित करते समय मापने योग्य कोई अंतर नहीं है।

जब मैं निष्पादन योजना को देखता हूं तो वे दोनों क्लस्टर्ड इंडेक्स की तलाश करते हैं जिसमें 100% क्वेरी लागत होती है। जबकि अतिरिक्त चयन और शीर्ष ऑपरेशन में 0% क्वेरी लागत है। ईएफप्रोफाइलर से पूछताछ योजना का कहना है कि यह दर्शाता है कि इससे कोई फर्क नहीं पड़ता है।

इस मामले में क्वेरी प्रदर्शन के बारे में बेहतर समझने के लिए मैं क्या कर सकता हूं?

नीचे पहली क्वेरी के परिणामस्वरूप एसक्यूएल है।

SELECT [Limit1].[Id]      AS [Id], 
    [Limit1].[EmailAddress]   AS [EmailAddress], 
    [Limit1].[FirstName]    AS [FirstName], 
    [Limit1].[LastName]    AS [LastName] 
FROM (SELECT TOP (2) [Extent1].[Id]      AS [Id], 
        [Extent1].[EmailAddress]   AS [EmailAddress], 
        [Extent1].[FirstName]    AS [FirstName], 
        [Extent1].[LastName]    AS [LastName] 
    FROM [dbo].[Users] AS [Extent1] 
    WHERE ([Extent1].[Id] = 'b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */) 
      AND ('b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */ IS NOT NULL)) AS [Limit1] 

यहां दूसरी (तेज) क्वेरी का वर्ग।

SELECT [Extent1].[Id]      AS [Id], 
    [Extent1].[EmailAddress]   AS [EmailAddress], 
    [Extent1].[FirstName]    AS [FirstName], 
    [Extent1].[LastName]    AS [LastName] 
FROM [dbo].[Users] AS [Extent1] 
WHERE ([Extent1].[Id] = 'b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */) 
    AND ('b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */ IS NOT NULL) 
+1

आप अपने दूसरे उदाहरण में 'ToList()' कॉल भी छोड़ सकते हैं। एक प्रश्न पर एकल() 'भी * गणना *। बस 'कहां()' खंड रखें। –

+0

प्रबंधन स्टूडियो में वही प्रश्न चलाने पर क्या होता है? घोंसला एक धीमा निष्पादित करता है या नहीं? आप उन समय से कहाँ गए थे? ग्राहक (प्रतिक्रिया समय के रूप में) या डीबी पर ही? –

+5

.Single() को "शीर्ष 2" परिणामों की आवश्यकता होती है ताकि यह निर्धारित किया जा सके कि कोई एकल मैच है या नहीं। नतीजे में एक पंक्ति का मतलब है सफलता, दो पंक्तियों या शून्य पंक्तियों का अर्थ है कि ".Single()" विफल रहा और एक त्रुटि फेंकनी चाहिए। आपके दूसरे उदाहरण में, ".ToList()" क्वेरी को ".Single()" के अनुप्रयोग से पहले निष्पादित करने का कारण बनता है। क्वेरी किसी भी संख्या को वापस कर सकती है, एक। .Single() विधि सूची परिणाम पर लागू की जाएगी। – Grax

उत्तर

0

जब आप कहते हैं

dbContext.Users.Single(u => u.Id == userId);

उपयोगकर्ता प्रकार DbSet की है या उन की अपनी एक संग्रह है, तो यह पहले के साथ साथ उपयोगकर्ताओं के संग्रह प्राप्त है
dbContext.Users.Where(u => u.Id == userId).ToList().Single(); में यह लोड करने के लिए स्थिति हैं यह।

तो अगर वहाँ थे 100 उपयोगकर्ता पहली क्वेरी 100 उपयोगकर्ताओं को लाने और फिर छानने करते जाएगा, जबकि दूसरा एक में यह केवल लायेगा 1.

आशा इस मदद करता है।

+3

अंशुल, पहली क्वेरी केवल उस उपयोगकर्ता से मेल खाने वाले डेटाबेस से पहले दो उपयोगकर्ताओं को वापस कर देगी। यह सभी 100 उपयोगकर्ताओं को नहीं लाता है। भले ही उस उपयोगकर्ता आईडी के साथ 100 उपयोगकर्ता हैं। दूसरा उन उपयोगकर्ता को वापस करेगा जो उस उपयोगकर्ता आईडी से मेल खाते हैं, फिर स्मृति में एकल विधि लागू होगी। –

+0

स्टैक ओवरफ्लो पर अपने प्रश्न यहां क्यों नहीं पूछें (लेकिन अलग थ्रेड)? :) –

2

आप वास्तव में क्या चाहते हैं dbContext.Users.Find(id) - यह डेटाबेस में भी नहीं होगा यदि इसे नहीं करना है। msdn पर और जानकारी देखें।

+0

+1 मुझे ढूंढने के बारे में बताने के लिए +1()। मैं इससे पहले नहीं जानता था। लेकिन इस विशेष मामले में यह एकल के साथ एक ही एसक्यूएल उत्पन्न करता है और इसमें भी वही (खराब) प्रदर्शन होता है। – Towa

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