Несколько объединений в запросе - PullRequest
1 голос
/ 27 января 2012

У меня есть этот SP с более чем 10 таблицами. В подчеркнутых строках есть таблица AllData, которая объединяется 3 раза из-за имени поля в предложении where.

Будем весьма благодарны за любые предложения о том, как лучше обрабатывать этот сложный запрос. В основном, чтобы избежать многократного присоединения к AllData (с псевдонимами ad1, adl2, adl3). Это может повлиять на производительность.

Вот сп

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

Ответы [ 2 ]

1 голос
/ 27 января 2012

Хочу заметить, что у вас есть декартово соединение между таблицами 2 и 3 - если одна из этих таблиц не очень мала, это может существенно повлиять на производительностьЯ предлагаю явно объединить Table2 с одной из других таблиц в запросе, чтобы повысить производительность.

1 голос
/ 27 января 2012

Одна вещь, которую вы можете попробовать, - это перенести условия объединения в объединения.

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 и т. Д.

...