簡體   English   中英

由於加入 SQL 導致的性能問題

[英]Performance Issue due to join in SQL

我在使用左連接(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 秒。 但在這種情況下,我讓用戶休假。

請幫忙,

提前致謝。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM