由于加入SQL而导致的性能问题

时间:2019-12-03 09:57:23

标签: sql sql-server join

我有一个问题,就是在使用左联接(3分钟)时需要花费更多时间来获取数据。但是,当尝试进行内部联接时,只需要不到20秒的时间。由于内部联接消除了在相应表中没有数据的其他记录,因此我无法获取所有记录。请帮助解决此问题。

查询:

SELECT UserName, UserEmail, UserLeaveReason FROM [dbo].[UserData] UD WITH (NOLOCK) 
INNER JOIN #vw_User REQ on UD.UserID= REQ.UserID 
LEFT JOIN Txn_UserLeaveDetails TD ON TD.RELREQID = REQ.RELREQID AND TD.IsActive = 1 
LEFT JOIN MST_LeaveDescription TS ON TS.LeaveDescriptionId = TD.LeaveDescriptionId 

Txn_UserLeaveDetails:包含用户的休假详细信息,可以是活动的,也可以是非活动的(过去的叶子)。对于此查询,我只需要当前叶子的数据。

**Txn_UserLeaveDetails** 
    RELREQID
    UserID
    LeaveStartDate
    LeaveEndDate
    CreatedDate
    CreatedBy
    UpdatedDate
    UpdatedBy
    IsActive

MST_LeaveDescription:该表提供了请假原因的描述。

**MST_LeaveDescription**
    LeaveDescriptionId 
    LeaveReason
    CreatedDate
    UpdateDate 

在以上查询输出中,我需要所有用户数据,无论其休假状态如何。但是使用上面的查询需要3分钟。但是,当我将MST_LeaveDescription的联接更改为内部联接时,仅需20秒。但是在那种情况下,我会让用户休假。

请帮助

谢谢。

1 个答案:

答案 0 :(得分:0)

create table #UserLeave
(
    UserId int index idxUserId,
    UserLeaveReason varchar(200)
)

--get active leaves
insert into #UserActiveLeave(UserId, UserLeaveReason)
select TD.UserID, TS.LeaveReason
from Txn_UserLeaveDetails TD 
join MST_LeaveDescription TS on TD.LeaveDescriptionId = TS.LeaveDescriptionId
where TD.IsActive = 1; 

--get the rest of the users without active leaves
insert into #UserActiveLeave(UserId)
select UserID
from [dbo].[UserData]
except
select UserId
from #UserActiveLeave;

--result
select ud.UserName, ud.UserEmail, ua.UserLeaveReason
from #UserActiveLeave as ua
join [dbo].[UserData] as ud on ua.UserId = ud.UserId;