मैं शामिल होने के साथ तालिकाओं के एक सेट से डेटा का चयन कर रहा हूं, लेकिन जब मैं इसे निष्पादित करता हूं तो इसमें बहुत अधिक समय लगता है। applicationusagelog तालिका में बल्क डेटा है।

   SELECT  CONVERT(varchar(6),( AccessTime/3600))
            + ':' + RIGHT('0' + CONVERT(varchar(2), (AccessTime % 3600) / 60), 2)
            + ':' + RIGHT('0' + CONVERT(varchar(2), AccessTime % 60), 2) as AccessTime
            From
            (
                Select SUM(DATEPART(SECOND,LogTime)) as AccessTime
                From   applicationusagelog
                       Inner Join usermaster    On usermaster.EmployeeID=applicationusagelog.CreatedBy
                       Inner Join em_masteruser On em_masteruser.id=usermaster.OrganizationId
                Where  Cast(applicationusagelog.CreatedOn as date) Between '01-01-2018' And '04-04-2018' 
                And    em_masteruser.id='1' 
                And    applicationusagelog.ApplicationName not in
                        (
                            SELECT  master_domainapp.domainname 
                            From    master_domainapp
                                    Inner Join master_category_application On master_category_application.CategoryId=master_domainapp.CategoryId
                                    Inner Join em_masteruser On em_masteruser.id=master_domainapp.CreatedBy
                            Where  em_masteruser.id='1' 
                            And    master_category_application.CreatedBy='1'
                        )
            )x

कोई लोडिंग समय कम करने में मदद करता है ...

0
Aakash Singh 13 अप्रैल 2018, 08:28

2 जवाब

सबसे बढ़िया उत्तर

NOT IN शर्त को LEFT JOIN से बदलने का प्रयास करें।

SELECT DISTINCT master_domainapp.domainname
INTO #domainnames
FROM master_domainapp
INNER JOIN master_category_application ON master_category_application.CategoryId = master_domainapp.CategoryId
INNER JOIN em_masteruser ON em_masteruser.id = master_domainapp.CreatedBy
WHERE em_masteruser.id = '1'
    AND master_category_application.CreatedBy = '1'

SELECT CONVERT(VARCHAR(6), (AccessTime / 3600)) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), (AccessTime % 3600) / 60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), AccessTime % 60), 2) AS AccessTime
FROM (
    SELECT SUM(DATEPART(SECOND, LogTime)) AS AccessTime
    FROM applicationusagelog
    INNER JOIN usermaster ON usermaster.EmployeeID = applicationusagelog.CreatedBy
    INNER JOIN em_masteruser ON em_masteruser.id = usermaster.OrganizationId
    LEFT JOIN #domainnames ON #domainnames.domainname = applicationusagelog.ApplicationName
    WHERE Cast(applicationusagelog.CreatedOn AS DATE) BETWEEN '01-01-2018'
            AND '04-04-2018'
        AND em_masteruser.id = '1'
        AND #domainnames.domainname IS NULL
    ) x

यदि NOT IN उप क्वेरी में तालिकाएँ भारी हैं, तो यह प्रदर्शन में सुधार कर सकता है।

0
Jatin Patel 13 अप्रैल 2018, 09:24

सबसे अधिक संभावना है कि जहां क्लॉज मुख्य अपराधी है, वहां क्रिएटऑन टू डेटटाइम की कास्टिंग। कास्ट का उपयोग करने के बाद, डेटाबेस आपकी तिथि सीमा पर संभावित रिज़ल्ट सेट को कम करने के लिए अब किसी इंडेक्स का उपयोग नहीं कर सकता है। यह बदले में डेटाबेस को तिथियों की पूरी श्रृंखला को देखने के लिए मजबूर करता है, जिसके परिणामस्वरूप डिस्क की बहुत धीमी पहुंच होती है।

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

0
Blueprint41 13 अप्रैल 2018, 08:35