Mulitple se joint à une requête

J'ai ce SP avec plus de 10tables impliqués. Dans les lignes soulignées, il y a une table AllData qui est jointe 3 fois à cause du nom de champ dans la clause where.

Toutes les suggestions sur la façon de mieux gérer cette requête complexe seront grandement appréciées. Surtout, pour éviter les multiples fois que je rejoins AllData (avec les noms d'alias ad1, adl2, adl3). Cela pourrait affecter la performance.

Voici le 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 ------ 

Je remarque que vous semblez avoir une jointure cartésienne entre Table2 et Table3 – à less que l'une de ces tables soit très petite, cela affectera radicalement les performances. Je suggère de joindre explicitement Table2 à l'une des autres tables de la requête, pour améliorer les performances.

Une chose que vous pourriez essayer est de déplacer les conditions where dans les jointures

 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' 

Cela donnerait de meilleures performances car la taille de la jointure serait limitée aux seuls loggings que vous voulez. Pour ce faire, vous pouvez join AllData ad on (t1.xxx = ad.ListKey AND ad.FieldName = xxx) OR (b.ms = ad.ListKey AND ad.FieldName = 'ms')... Le problème avec cette option est que vous n'avez plus de colonnes distinctes pour ad1, ad2, etc.