Select groupby中的性能问题

时间:2016-02-25 15:40:18

标签: sql sql-server-2008-r2

我有以下代码块,执行大约需要4-5分钟。该块中的所有表都有大量数据。

Select  
    spa.Student_Id,    
    Cast(Case When ISNULL(@PeriodNumbers, '') = '' Then  --PeriodCode Come  
        CPS.PeriodIdentifier    
       Else             --period number come  
        Cast(SPA.PeriodNumber as varchar)   
    End As varchar) As Period,     
    IsNULL(Count(*), 0) As TotalCount,  
    AC.ExcessiveAbsAttendanceType,  
    Cast(SPA.PeriodNumber as varchar) As PeriodNumber            
From
    (Select Student_ID    
     From OpenXml(@Handle,'/NewDataSet/Table', 2)    
        With (Student_ID int) As DT    
    ) FilterDT 
Inner Join 
    dbo.StudentPeriodicAttendanceArchive SPA WITH(NOLOCK) On FilterDT.Student_ID = SPA.Student_ID  
Inner Join 
    dbo.AcademicYear AY WITH(NOLOCK) On AY.AYIdentifier = @AYIdentifier 
                                     And AY.School_Domain = @School_Domain    
Inner join 
     dbo.CPsession CPS WITH(NOLOCK) On CPS.SSEC_ID = SPA.SSEC_ID  
                                    And CPS.PeriodNumber= spa.periodnumber  
                                    And CPS.School_Domain = @School_Domain   
                                    And CPS.AYIdentifier = @AYIdentifier  
                                    And (CPS.CPSDelStatus = 0 Or CPS.CPSDelStatus Is Null)
Inner Join 
    dbo.BellTimingScheduleStructure BTSS WITH(NOLOCK) ON BTSS.DayNumber = CPS.WD_ID 
                                                      And BTSS.SchedulingWeek = CPS.Week   
Inner Join 
    dbo.ClassPeriods CP WITH(NOLOCK) On CP.CP_Id = CPS.CP_ID 
                                     And BTSS.CPR_ID = CP.CPR_ID  
                                     And BTSS.WeekDay = Case When BTSS.CPRType='D' Then BTSS.WeekDay Else CP.WD_ID End  
                                     And BTSS.DayNumber = Case When BTSS.CPRType='D' Then CP.WD_ID Else BTSS.DayNumber End  
                                     And BTSS.SchedulingWeek = Case When BTSS.CPRType='W' Then BTSS.SchedulingWeek Else CP.Week End  
                                     And BTSS.DateItem = SPA.Attdate  
                                     And CP.CPDelStatus = '0'  
                                     And IsNull(CP.IsLocked, '0') = '0'  
Inner Join 
    dbo.AttendanceCodes AC WITH(NOLOCK) On AC.AC_ID = SPA.AttCode_ID
Where 
    SPA.School_Domain = @School_Domain           
    And AttDate >= Case When @IsYearLongTotals=1 then AY.AYStartDate Else @ActualStartDate End 
    And AttDate <= Case When @IsYearLongTotals=1 then AY.AYEndDate Else @ActualEndDate End  
    And IsNull(@Subject_ID, -1) = Case When IsNull(@Subject_ID, -1) <> -1   
            Then CPS.Subject_ID   
            Else IsNull(@Subject_ID, -1)  
          End   
Group By 
    spa.Student_ID,  
    Cast(Case When ISNULL(@PeriodNumbers, '') = '' 
                 Then CPS.PeriodIdentifier
              Else    
                 Cast(SPA.PeriodNumber as varchar)  
         End As varchar), AC.ExcessiveAbsAttendanceType,  
    Cast(SPA.PeriodNumber as varchar) 

我有一张表StudentPeriodicAttendanceArchive,其中包含出勤信息。我想计算总存在和不存在的数量。

请建议我应该怎样做才能提高效果。我正在使用SQL Server 2008 R2

0 个答案:

没有答案