проблема производительности внутреннего соединения с или условие - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть sp, который возвращает 3 миллиона записей.сейчас это занимает 16 минут.Я пытаюсь оптимизировать это.так как есть или условие в присоединиться его время.есть ли способ его оптимизировать?

SELECT
    id, from
FROM
    [#Temp1] AD              
    JOIN [#Temp2]  SS
        ON AD.Id = SS.Id
        OR (SS.Code = AD.Code AND AD.ID IS NULL)        
JOIN wTable1 WSS WITH(NOLOCK)               
    ON SS.PId= WSS.Id

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Как указано в вероятном дубликате Имеет ли 'ИЛИ' в состоянии ВНУТРЕННЕГО СОЕДИНЕНИЯ плохую идею? это заставит план с вложенными циклами и часто заменяет его на UNION, выплачивает дивиденды (UNION ALL в данном случае, так как ветви являются взаимоисключающими).В приведенном ниже примере каждая ветвь UNION ALL может использовать хеш-соединение или объединение слиянием, поскольку они являются прямыми равными соединениями)

Неясно, из какой таблицы состоит каждый столбец в вашем запросе, но основной подход -

WITH SS
     AS (SELECT SS.Id,
                SS.PId
         FROM   [#Temp1] AD
                JOIN [#Temp2] SS
                  ON AD.Id = SS.Id
         WHERE  AD.ID IS NOT NULL
         UNION ALL
         SELECT SS.Id,
                SS.PId
         FROM   [#Temp1] AD
                JOIN [#Temp2] SS
                  ON AD.Code = SS.Code
         WHERE  AD.ID IS NULL)
SELECT SS.Id,
       WSS.[from]
FROM   SS
       JOIN wTable1 WSS 
         ON SS.PId = WSS.Id 
0 голосов
/ 09 февраля 2019

Часто лучшим подходом является использование left join s:

select id, 
       coalesce(wss1.col, wss2.col) as col
from [#Temp1] AD left join            
     [#Temp2] SS1
     ON AD.Id = SS1.Id left join
     [#Temp2] SS2
     ON SS2.Code = AD.Code AND AD.ID IS NULL LEFT JOIN
     wTable1 WSS1            
     ON WSS1.Id = SS1.PID LEFT JOIN
     wTable1 WSS2
     ON WSS2.ID = SS2.PID
WHERE SS1.ID IS NOT NULL OR SS2.CODE IS NOT NULL;  -- one of the joins works  

Я не могу обещать, что это работает в вашем конкретном случае, потому что вы не предоставили данные образца и желаемые результаты.Тем не менее, этот подход работает в подобных случаях.

...