2016-09-17 42 views
3

我有这样摆脱昂贵的自我加入

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; 

一个SQL语句,该SQL通常被称为并且由于表ps有100M行左加入是伤害。有没有办法使用左加入来重写这个?

问候 尼克

+1

这个查询应该做什么?你能提供一些样本数据和所需的结果吗? – Mureinik

+1

正在为'ps'中的日期列索引一个选项? – dlatikay

+0

上有datecolumn的索引,但SQL Server使用哈希联接,并且不使用索引 –

回答

2

或许,这将有助于

Select pa.col1 
      ,col2  =isnull(sum(case when [email protected]     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 
+0

我也这么想过。但你忘了GROUP BY –

+0

@ThomasG很好!谢谢。更新 –

1

如果约翰的查询不帮你也可以试试这个:

SELECT 
    pa.col1 
    ,SUM(ps1.col2) col2 
    ,SUM(ps2.col2) col2_previous_month 

FROM pa 

    LEFT JOIN 
     (
      SELECT col2 
      FROM ps 
      WHERE date = @currDate 
     ) ps1 ON ON pa.Id = ps1.Id   

    LEFT JOIN 
     (
      SELECT col2 
      FROM ps 
      WHERE date = dateadd(month, - 1, @currDate) 
     ) ps2 ON ON pa.Id = ps2.Id 

GROUP BY pa.col1; 

我认为它后读过你的评论。

它是完全一样的,只是我感动的日期搜索嵌套查询,这可能有助于优化正确使用索引中的您的初始查询。

0

查询看起来不错。为了使它执行快,你应该有以下指标:

  • PA(ID)
  • PS(ID,日期)

如果你想它仍然较快,利用了覆盖索引:

  • PA(ID,COL1)
  • PS(ID,日期,COL2)