簡體   English   中英

改進此SQL查詢以獲得更好的性能

[英]Improve this SQL Query for better performance

DBA不喜歡我使用帶有子查詢的case語句。 我還有其他方法可以提高性能嗎? 此更新語句是存儲過程的一部分。

    UPDATE dbo.CMN_PersonsFerpa 
    SET 
        IsWorkEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'Work'  THEN @IsFERPA ELSE IsWorkEmailFerpa END,
        IsPersonalEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'Personal'  THEN @IsFERPA ELSE IsPersonalEmailFerpa END,
        IsParentEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'Parent'  THEN @IsFERPA ELSE IsParentEmailFerpa END,
        IsTempEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'Temporary'  THEN @IsFERPA ELSE IsTempEmailFerpa END,
        IsFAFSAEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'FAFSA'  THEN @IsFERPA ELSE IsFAFSAEmailFerpa END,
        IsCSSProfEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'CSS Profile'  THEN @IsFERPA ELSE IsCSSProfEmailFerpa END,
        IsCommenceEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'Commencement'  THEN @IsFERPA ELSE IsCommenceEmailFerpa END,
        IsAcctHoldEmailFerpa = (CASE WHEN (SELECT EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID) =  'Account Holder'  THEN @IsFERPA ELSE IsAcctHoldEmailFerpa END
    Where CMN_PersonsFerpa.cmn_personsID = (select cmn_personsID from CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID)

經過幾個建議,這就是我的意思。 這可以接受嗎? 或者,還有更好的方法?:

    SELECT @DBType = EmailType, @cmn_personsID = CMN_PersonsID FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID

    UPDATE dbo.CMN_PersonsFerpa 
    SET 
        IsWorkEmailFerpa = CASE WHEN @DBType =  'Work'  THEN @IsFERPA END,
        IsPersonalEmailFerpa = CASE WHEN @DBType =  'Personal'  THEN @IsFERPA END,
        IsParentEmailFerpa = CASE WHEN @DBType = 'Parent'  THEN @IsFERPA END,
        IsTempEmailFerpa = CASE WHEN @DBType =  'Temporary'  THEN @IsFERPA END,
        IsFAFSAEmailFerpa = CASE WHEN @DBType =  'FAFSA'  THEN @IsFERPA END,
        IsCSSProfEmailFerpa = CASE WHEN @DBType =  'CSS Profile'  THEN @IsFERPA END,
        IsCommenceEmailFerpa = CASE WHEN @DBType =  'Commencement'  THEN @IsFERPA END,
        IsAcctHoldEmailFerpa = CASE WHEN @DBType =  'Account Holder'  THEN @IsFERPA END,
        LastChangeBy = @UserGUID,
        LastChangeDateTime = GETDATE()
            Where CMN_PersonsFerpa.cmn_personsID = @CMN_PersonsID

目標是消除子查詢。 您可以通過在更新前建立一個臨時表或使用適當的鏈接來做到這一點。 在不知道您的數據模式的情況下,很難幫助您設計一些東西,但是這里有一個鏡頭:

update p set 
    IsWorkEmailFerpa = case when e.EmailType = 'Work' then @IsFERPA else IsWorkEmailFerpa end,
    IsPersonalEmailFerpa = case when e.EmailType = 'Personal' then @IsFERPA else IsPersonalEmailFerpa end,
    IsParentEmailFerpa = case when e.EmailType = 'Parent' then @IsFERPA else IsParentEmailFerpa end,
    IsTempEmailFerpa = case when e.EmailType = 'Temporary' then @IsFERPA else IsTempEmailFerpa end,
    ...
    IsAcctHoldEmailFerpa = case when e.EmailType = 'Account Holder' then @IsFERPA else IsAcctHoldEmailFerpa end,
from  dbo.CMN_PersonsFerpa  p
    join dbo.CMN_PersonsEmailLinks e
        on e.cmn_personsID = p.cmn_personsID
where e.CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID

為什么不使用聯接? 相關子查詢像游標一樣逐行工作,幾乎不應該使用。

與其將查詢運行8次,不如將其運行到變量中一次並對變量本身執行案例。

看起來像這樣:

SELECT @EmailType = EmailType FROM dbo.CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID

UPDATE dbo.CMN_PersonsFerpa 
    SET 
        IsWorkEmailFerpa = (CASE WHEN @EmailType =  'Work'  THEN @IsFERPA ELSE IsWorkEmailFerpa END,
        IsPersonalEmailFerpa = (CASE WHEN @EmailType =  'Personal'  THEN @IsFERPA ELSE IsPersonalEmailFerpa END,
        IsParentEmailFerpa = (CASE WHEN @EmailType =  'Parent'  THEN @IsFERPA ELSE IsParentEmailFerpa END,
        IsTempEmailFerpa = (CASE WHEN @EmailType =  'Temporary'  THEN @IsFERPA ELSE IsTempEmailFerpa END,
        IsFAFSAEmailFerpa = (CASE WHEN @EmailType =  'FAFSA'  THEN @IsFERPA ELSE IsFAFSAEmailFerpa END,
        IsCSSProfEmailFerpa = (CASE WHEN @EmailType =  'CSS Profile'  THEN @IsFERPA ELSE IsCSSProfEmailFerpa END,
        IsCommenceEmailFerpa = (CASE WHEN @EmailType =  'Commencement'  THEN @IsFERPA ELSE IsCommenceEmailFerpa END,
        IsAcctHoldEmailFerpa = (CASE WHEN @EmailType =  'Account Holder'  THEN @IsFERPA ELSE IsAcctHoldEmailFerpa END
    Where CMN_PersonsFerpa.cmn_personsID = (select cmn_personsID from CMN_PersonsEmailLinks WHERE CMN_PersonsEmailLinksID = @CMN_PersonsEmailLinksID)

暫無
暫無

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

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