sql - एसक्यूएल क्वेरी एक बहुत लंबे समय के लिए चल रहा है अगर खोज शब्द नहीं मिला




sql-server linq linq-to-sql asp.net-core (3)

पहले से ही आप इस तरह अपनी क्वेरी को सरल कर सकते हैं;):

int start=page * recordsInPage;

var inner = (from user in db.Users
            where user.Name.Contains(name) && !user.Deleted && user.AppearInSearch
            orderby user.Verified descending
            select  new
                   {
                     Name = user.Name,
                     Verified = user.Verified,
                     PhotoURL = user.PhotoURL,
                     UserID = user.Id,
                     Subdomain = user.Subdomain,
                     Deleted=user.Deleted,
                     AppearInSearch = user.AppearInSearch
                   }
             ).Skip(start).Take(recordsInPage);

return await inner.ToListAsync();

यदि आपके पास एक प्रदर्शन समस्या है, तो अपने एसक्यूएल के साथ एक संग्रहीत प्रक्रिया बनाने का प्रयास करें और इसे इकाई फ़्रेमवर्क के साथ प्रयोग करें।

मेरे एज़्योर में एएसपी.नेट कोर साइट की मेजबानी की, मेरे पास उपयोगकर्ताओं की एक मेज है और मैंने निम्नानुसार खोज को लागू किया है:

    var inner = from user in db.Users
             select  new
             {
                 Name = user.Name,
                 Verified = user.Verified,
                 PhotoURL = user.PhotoURL,
                 UserID = user.Id,
                 Subdomain = user.Subdomain,
                 Deleted=user.Deleted,
                 AppearInSearch = user.AppearInSearch
             };
    return await inner.Where(u=>u.Name.Contains(name)&& !u.Deleted && u.AppearInSearch)
                                    .OrderByDescending(u => u.Verified)
                                    .Skip(page * recordsInPage)
                                    .Take(recordsInPage)
                                    .Select(u => new UserSearchResult()
                                    {
                                        Name = u.Name,
                                        Verified = u.Verified,
                                        PhotoURL = u.PhotoURL,
                                        UserID = u.UserID,
                                        Subdomain = u.Subdomain
                                    }).ToListAsync();

यह निम्न के जैसा एक SQL कथन का अनुवाद करता है:

SELECT [t].[Name], [t].[Verified],
       [t].[PhotoURL], [t].[Id], 
       [t].[Subdomain], [t].[Deleted], 
       [t].[AppearInSearch]  
FROM (      
        SELECT [user0].[Name], [user0].[Verified], 
               [user0].[PhotoURL], [user0].[Id], 
               [user0].[Subdomain], [user0].[Deleted], 
               [user0].[AppearInSearch]      
        FROM [AspNetUsers] AS [user0]
        WHERE (((CHARINDEX('khaled', [user0].[Name]) > 0) OR ('khaled' = N'')) 
          AND ([user0].[Deleted] = 0)) 
          AND ([user0].[AppearInSearch] = 1)      
        ORDER BY [user0].[Verified] DESC      
        OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY  ) AS [t]

यदि खोज शब्द डेटाबेस में उपलब्ध है, परिणाम एक सेकंड से कम में प्राप्त होता है हालांकि, अगर यह नहीं मिला है तो क्वेरी बहुत लंबे समय तक चलती है (मैंने इसे एक बार 48 सेकंड तक पहुंचाया है)।

जब हम इस सुविधा को इंटरनेट पर प्रकाशित करते हैं, तो यह बहुत प्रभावित होता है।

क्या आप इस मुद्दे को सुलझाने का एक तरीका सुझा सकते हैं?

धन्यवाद

अद्यतन: यह मुद्दा यहां जारी रखा गया है: खाली लॉगिन नाम दिखा रहा है जब sys.processes


SQL सर्वर से मेल खाने वाली पंक्तियों को खोजने के लिए स्कैन का उपयोग करना होगा। इसके अलावा कोई रास्ता नहीं है।

हालांकि, यदि हम SQL सर्वर को स्कैन करने के लिए डेटा की मात्रा कम करते हैं, तो हम क्वेरी को गति देगा।

फ़िल्टर्ड इंडेक्स को कवर करना

एक सूचकांक "आच्छादन" है यदि इसमें सभी डेटा को क्वेरी में लौटाया जाना आवश्यक है

CREATE INDEX IX_User_Name_filtered ON USER ([Verified], [Name]) 
INCLUDE ( [PhotoURL], [Id], [Subdomain], [Deleted], [AppearInSearch]  ) 
WHERE [AppearInSearch]=1 AND [Deleted]=0

यह सूचकांक मूल तालिका की तुलना में काफी कम है, इसलिए भी यदि स्कैन की आवश्यकता है, तो यह तेज़ हो जाएगा।

उत्पन्न होने वाली योजना के आधार पर, यह सूचकांक एक बेहतर विकल्प हो सकता है। इसमें अतिरिक्त कॉलम शामिल नहीं हैं और अभी भी छोटे होंगे सबसे अच्छा विकल्प निर्धारित करने के लिए परीक्षण की आवश्यकता होगी

CREATE INDEX IX_User_Name_filtered ON USER ([Verified], [Name]) 
WHERE [AppearInSearch]=1 AND [Deleted]=0

प्रत्येक डेटाबेस के कार्यान्वयन पर आप शायद अनुमान लगा सकते हैं कि वे सभी सामान्य समस्याओं को कम या ज्यादा तरीके से हल करते हैं। यदि आप एमएसएसक्यूएल का उपयोग कर रहे हैं तो उत्पन्न होने वाली निष्पादन योजना पर एक नज़र डालें। आप प्रोफाइलर और निष्पादन योजनाओं को चालू करके ऐसा कर सकते हैं। जब आप कमांड चलाते हैं तो यह आपको टेक्स्ट संस्करण देगा।

मुझे यकीन नहीं है कि आप किस एमएसएसक्यूएल का उपयोग कर रहे हैं लेकिन आप क्वेरी विश्लेषक में SQL Server 2000 में आलेखीय प्राप्त कर सकते हैं। मुझे यकीन है कि यह कार्यक्षमता कुछ संस्करणों को गुप्त कर रही है जहां बाद के संस्करणों में SQL सर्वर स्टूडियो प्रबंधक में।

बहिष्करण योजना पर एक नज़र डालें। जहां तक ​​संभव हो, तालिका स्कैन से बचें जब तक कि आपकी तालिका छोटी न हो, इस स्थिति में एक तालिका स्कैन एक इंडेक्स का उपयोग करने से तेज है। विभिन्न अलग-अलग परिचालनों पर पढ़ें जो प्रत्येक अलग-अलग परिदृश्य उत्पन्न करते हैं।





sql sql-server linq linq-to-sql asp.net-core