मेरे पास काफी सरल क्वेरी है जो बहुत धीमी है। इकाई फ्रेमवर्क प्रोफाइलर का कहना है कि इसमें लगभग 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)
आप अपने दूसरे उदाहरण में 'ToList()' कॉल भी छोड़ सकते हैं। एक प्रश्न पर एकल() 'भी * गणना *। बस 'कहां()' खंड रखें। –
प्रबंधन स्टूडियो में वही प्रश्न चलाने पर क्या होता है? घोंसला एक धीमा निष्पादित करता है या नहीं? आप उन समय से कहाँ गए थे? ग्राहक (प्रतिक्रिया समय के रूप में) या डीबी पर ही? –
.Single() को "शीर्ष 2" परिणामों की आवश्यकता होती है ताकि यह निर्धारित किया जा सके कि कोई एकल मैच है या नहीं। नतीजे में एक पंक्ति का मतलब है सफलता, दो पंक्तियों या शून्य पंक्तियों का अर्थ है कि ".Single()" विफल रहा और एक त्रुटि फेंकनी चाहिए। आपके दूसरे उदाहरण में, ".ToList()" क्वेरी को ".Single()" के अनुप्रयोग से पहले निष्पादित करने का कारण बनता है। क्वेरी किसी भी संख्या को वापस कर सकती है, एक। .Single() विधि सूची परिणाम पर लागू की जाएगी। – Grax