Улучшение условного соединения SQL Server - PullRequest
0 голосов
/ 17 октября 2019

Правильно ли помещать эти условные предложения в оператор соединения для повышения производительности?

Я просто пытался использовать один и тот же код с использованием одного объединения и перекрестного применения для каждого используемого условия, но когда я использую код в другомзапросы, слишком медленно.

SELECT u2.fkPropertyID, u2.pkUnitId, u2.UnitCode, 
       u2.fkUnitViewID,u2.fkFloorPlanID, u2.fkCalendarTypeID
FROM dbo.tblUnit                u 
left join dbo.tblUnitGroup ug  ON ug.fkUnitLogicalID = u.pkUnitID
left JOIN dbo.tblUnit u2  on ((u2.fkUnitGroupID = u.pkUnitID and 
    u.ynPhyUnit = 0)                                             
    or
    (u2.pkUnitID = u.pkUnitID and u2.ynPhyUnit =1))
    or 
    (u2.pkUnitId = ug.fkUnitPhisicallID and u2.ynPhyUnit = 1)
where u.pkUnitId = 3806

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Просто для удовольствия, вот один из способов, которым вы могли бы переписать это. Я подозреваю, что если вы посмотрите на план выполнения, он будет идентичен.

SELECT u2.fkPropertyID
    , u2.pkUnitId
    , u2.UnitCode
    , u2.fkUnitViewID
    , u2.fkFloorPlanID
    , u2.fkCalendarTypeID
FROM dbo.tblUnit u 
left join dbo.tblUnitGroup ug  ON ug.fkUnitLogicalID = u.pkUnitID
left JOIN dbo.tblUnit u2  on 
    (
        u2.fkUnitGroupID = u.pkUnitID 
        and 
        u.ynPhyUnit = 0
    )   
    or
    (
        u2.pkUnitID in (u.pkUnitID, ug.fkUnitPhisicallID) 
        and 
        u2.ynPhyUnit = 1
    )
where u.pkUnitId = 3806
0 голосов
/ 17 октября 2019

Я получаю это с лучшими результатами в плане выполнения, я проверяю с другими значениями:

SELECT u2.fkPropertyID, u2.pkUnitId, u2.UnitCode, u2.fkUnitViewID, 
           u2.fkFloorPlanID, u2.fkCalendarTypeID
FROM tblUnit                u 
left join dbo.tblUnitGroup ug  ON ug.fkUnitLogicalID = u.pkUnitID
outer apply
(
 select uu2.fkPropertyID, uu2.pkUnitId, uu2.UnitCode, 
        uu2.fkUnitViewID, uu2.fkFloorPlanID, uu2.fkCalendarTypeID
 from dbo.tblUnit uu2 
 where ( ((uu2.fkUnitGroupID = u.pkUnitID) and (u.ynPhyUnit = 0))
         or
         ((uu2.pkUnitID = u.pkUnitID) and (uu2.ynPhyUnit = 1)) )
       or
       ( (uu2.pkUnitId = ug.fkUnitPhisicallID) and (uu2.ynPhyUnit = 1) )
) as u2
where u.pkUnitId = 3806
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...