簡體   English   中英

如何在SQL Server中優化此查詢,因為它消耗更多時間執行

[英]How to optimize this query in SQL Server, as it is consuming more time to execute

SELECT 
   A.RegTimePartnerID AS OrganiationID,    
   P.PartnerName AS OrganiationName,    
   PUIDCount AS IndividualsTrained_count,    
   EventCount AS TrainingActivities_count,    
   SalesCount AS Salestraining_Count,    
   TechCount AS Technicaltraining_count,    

   CASE WHEN OnDemandCount = 0 THEN 100 
        ELSE (Onlinecount*100/OnDemandCount) 
   END AS  LivevsOndemand     
FROM    
   dbo.Partner P    
INNER JOIN     
   (SELECT RegTimePartnerID, COUNT(distinct UniqueID) AS PUIDCount 
    FROM dbo.DenormTrainingActivity(NOLOCK) 
    GROUP BY RegTimePartnerID) A    
   ON P.PartnerID = A.RegTimePartnerID AND P.PartnerID <> 0    

INNER JOIN    
   (SELECT RegTimePartnerID, COUNT(distinct EventID) AS EventCount 
    FROM dbo.DenormTrainingActivity(NOLOCK) 
    GROUP BY RegTimePartnerID) B    
   ON A.RegTimePartnerID = B.RegTimePartnerID    

INNER JOIN     
   (SELECT RegTimePartnerID, COUNT(distinct EventID) AS SalesCount 
    FROM dbo.DenormTrainingActivity(NOLOCK)     
    WHERE CourseTypeid = 10 
    GROUP BY RegTimePartnerID) C    
   ON A.RegTimePartnerID = C.RegTimePartnerID    

INNER JOIN     
   (SELECT RegTimePartnerID, COUNT(distinct EventID) As TechCount 
    FROM dbo.DenormTrainingActivity(NOLOCK)     
    WHERE CourseTypeid = 20 
    GROUP BY RegTimePartnerID) D    
   ON A.RegTimePartnerID = D.RegTimePartnerID    

INNER JOIN     
   (SELECT RegTimePartnerID ,COUNT(distinct EventID) AS Onlinecount 
    FROM dbo.DenormTrainingActivity(NOLOCK)     
    WHERE EventCategory IN ('Live-ILT', 'Live-Online') 
    GROUP BY RegTimePartnerID) E    
   ON A.RegTimePartnerID = E.RegTimePartnerID    

INNER JOIN     
   (SELECT RegTimePartnerID, COUNT(distinct EventID) AS OnDemandCount 
    FROM dbo.DenormTrainingActivity(NOLOCK)     
    WHERE EventCategory NOT IN ('Live-ILT', 'Live-Online') 
    GROUP BY RegTimePartnerID) F    
   ON A.RegTimePartnerID = F.RegTimePartnerID

怎么樣(我肯定有錯別字):

SELECT 
   A.RegTimePartnerID AS OrganiationID,    
   P.PartnerName AS OrganiationName,
   (
        SELECT  COUNT(DISTINCT dta.[UniqueID])
        FROM    dbo.[DenormTraningActivity](NOLOCK) AS dta
        WHERE   dta.[RegTimePartnerID]  =   P.[PartnerID]
    ) AS PUIDCount,
    (
        SELECT  COUNT(DISTINCT dta.[EventID])
        FROM    dbo.[DenormTraningActivity](NOLOCK) AS dta
        WHERE   dta.[RegTimePartnerID]  =   P.[PartnerID]
    ) AS EventCount,
    (
        SELECT  COUNT(DISTINCT dta.[EventID])
        FROM    dbo.[DenormTrainingActivity](NOLOCK) AS dta
        WHERE   dta.[CourseTypeid]      =   10
            AND dta.[RegTimePartnerId]  =   P.[PartnerID]
    ) AS SalesCount,
    (
        SELECT  COUNT(DISTINCT dta.[EventID])
        FROM    dbo.[DenormTrainingActivity](NOLOCK) AS dta
        WHERE   dta.[CourseTypeid]      =   20
            AND dta.[RegTimePartnerID]  =   P.[PartnerID]
    ) AS TechCount,   

   CASE
        WHEN    (
                    SELECT  COUNT(DISTINCT dta.[EventID])
                    FROM    dbo.[DenormTrainingActivity](NOLOCK) AS dta
                    WHERE   dta.[EventCategory] IN  ('Live-ILT', 'Live-Online')
                        AND dta.[RegTimePartnerID]  =   P.[PartnerID]
                ) = 0 THEN 100 
        ELSE    (
                    SELECT  COUNT(DISTINCT dta.[EventID])
                    FROM    dbo.[DenormTrainingActivity](NOLOCK) AS dta
                    WHERE   dta.[EventCategory] IN  ('Live-ILT', 'Live-Online')
                        AND dta.[RegTimePartnerID]  =   P.[PartnerID]
                )*100/
                (
                    SELECT  COUNT(DISTINCT dta.[EventID])
                    FROM    dbo.[DenormTrainingActivity](NOLOCK) AS dta
                    WHERE   dta.[EventCategory] NOT IN  ('Live-ILT', 'Live-Online')
                        AND dta.[RegTimePartnerID]  =   P.[PartnerID]
                )
   END AS  LivevsOndemand     
FROM    
   dbo.Partner P
WHERE   P.[PartnerID] <> 0

我在想,嵌套子查詢可能比INNER JOIN / COUNT / GROUPBY便宜。 大概不是,因為必須為Partner表中的每個記錄評估每個子查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM