2012-01-27 61 views
1

我有超過10個參與此SP。在帶下劃線的行中,有一個表AllData由於where子句中的字段名而被連接了3次。Mulitple加入查詢

有關如何更好地處理此複雜查詢的任何建議將不勝感激。大多數情況下,爲了避免多次加入AllData(別名爲ad1,adl2,adl3)。這可能會影響性能。

這裏是SP

ALTER PROCEDURE [dbo].[StoredProc1] 
AS 
select case when pd.Show_Photo = '1,1,1' 
      then i.id 
      else null 
     end as thumbimage, 
     t1.FPId, 
     'WebProfile' as profiletype, 
     mmbp.Name as Name, 
     t1.Age, 
     t1.Height, 
     adl.ListValue as AlldataValue1, 
     adl2.ListValue as AlldataValue2, 
     adl3.ListValue as AlldataValue3, 
     c.CName, 
     ed.ELevel, 
     ed.EDeg, 
     NEWID() 
from Table2 mmbp, Table3 u 
join Table1 t1 on t1.Pid = u.Pid 
left join Table4 mmb on t1.Pid= mmb.Pid 
join table5 i on t1.Pid = i.Pid 
join table6 pd on t1.Pid = pd.Pid 
join table7 ed on t1.Pid = ed.Pid 
join table8 c on t1.xxx= c.xxx 
join AllData adl on t1.xxx = adl.ListKey 
join AllData adl2 on b.ms = adl2.ListKey 
join AllData adl3 on b.Diet = adl3.ListKey 
where adl.FieldName=xxx and 
     adl2.FieldName='ms' and 
     adl3.FieldName='Diet' and 
     ------ 
+0

Table2(別名mmbp)和where語句中省略條件中的任何其他表之間是否存在連接條件?另外,在運行查詢時,是否可以包含查詢的其餘部分以及查詢計劃? – 2012-01-27 10:10:08

回答

1

我注意到您似乎在Table2和Table3之間有笛卡爾連接 - 除非這些表中的一個非常小,這很可能以顯着影響性能。我建議顯式地將Table2加入到查詢中的其他表中,以提高性能。

1

有一兩件事你可以嘗試在移動那裏的條件爲加入

join AllData ad1 on t1.xxx = ad1.ListKey AND ad1.FieldName = xxx 
join AllData ad2 on b.ms = adl2.ListKey AND ad2.FieldName = 'ms' 
join AllData ad3 on b.Diet = adl3.ListKey AND ad3.FieldName = 'Diet' 

這將提供更好的性能爲連接大小將僅限於記錄你想要的。要做到這一點,所有在一個加入你可以join AllData ad on (t1.xxx = ad.ListKey AND ad.FieldName = xxx) OR (b.ms = ad.ListKey AND ad.FieldName = 'ms')...。使用此選項的問題是,您不再有明確的ad1,ad2等列。

+0

'這會提供更好的性能,因爲連接大小將僅限於您想要的記錄' - 將謂詞從where子句移動到join子句不會影響生成的執行計劃(在這種情況下爲內連接) - 嘗試一下你自己 – 2012-01-27 04:59:14

+0

@JCooper:「不太可能影響生成的執行計劃」將是一個更好的方式,比「不會影響生成的執行計劃」 - 除非你自己編寫SQLServer優化器,並知道它會做什麼*每一個可能的情況? (鑑於OP沒有包含整個查詢......) – 2012-01-27 09:54:52

+0

@Mark Ba​​nnister - 的確我沒有寫優化器。重點是邏輯上它們是相同的查詢。在內連接的情況下,連接條件在連接謂詞中還是在where子句中指定並且在邏輯上相同並不重要。只有在指定連接條件時,左連接纔是重要的。這就是說,它們在邏輯上是完全一樣的,我認爲優化器產生兩個不同的計劃是不太可能的。 – 2012-01-27 13:50:12