我有这个SP涉及超过10个表。在带下划线的行中,由于where子句中的fieldname,有一个表AllData被连接3次。
有关如何更好地处理此复杂查询的任何建议将不胜感激。大多数情况下,为了避免多次加入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 :(得分:1)
您可以尝试的一件事是将where条件移动到连接中
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等的不同列。
答案 1 :(得分:1)
我注意到您在Table2和Table3之间似乎有一个笛卡尔连接 - 除非其中一个表非常小,否则这可能会严重影响性能。我建议将Table2明确地连接到查询中的其他表之一,以提高性能。