2016-09-17 76 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)