2012-01-27 74 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