摆脱昂贵的自加入

Nic*_*ach 5 sql sql-server

我有一个这样的SQL语句

SELECT  
    pa.col1,
    SUM(ps.col2) col2,
    SUM(psl.col2) col2_previous_month
FROM  
    pa
LEFT JOIN 
    ps ON pa.Id = ps.Id AND ps.date = @currDate
LEFT JOIN 
    ps as psl ON psl.Id = ps.Id AND psl.date = dateadd(month, - 1, @currDate)
GROUP BY 
    pa.col1;
Run Code Online (Sandbox Code Playgroud)

此 SQL 经常被调用,并且由于表ps有 100M 行,左连接会造成损害。有没有办法使用 left Join 重写这个?

问候尼克

Joh*_*tti 3

也许这会有所帮助

    Select pa.col1
          ,col2      =isnull(sum(case when ps.date=@currDate                   then ps.col2 else null end),0)
          ,col2_prior=isnull(sum(case when ps.date=dateadd(month,-1,@currDate) then ps.col2 else null end),0)
     From pa
     JOIN ps as ps ON pa.Id  = ps.Id 
      and ps.date in (@currDate,dateadd(month,-1,@currDate))
     Group By pa.col1
Run Code Online (Sandbox Code Playgroud)