2017-02-13 56 views
0

我有一個「更新」語句,包括一些內部連接。我在400K行上運行它,執行時間約爲11分鐘,這太長了。我在Access數據庫上運行相同的語句,它需要2分鐘。有什麼方法可以提高速度嗎?MS SQL服務器更新時間太長

UPDATE AA 
SET 
AA.Status_Flag = mapper.Status_Flag, 
AA.Review_Required_Flag = mapper.Review_Required_Flag, 
AA.Exemption = mapper.CF_BB_Exemption, AA.Bloomberg_Flag = 'True', 
AA.Bloomberg_Classification = mapper.LOGIC_IND 
FROM (AA INNER JOIN 
(SELECT * FROM tbl_BBG_Mapping inner join tbl_BBG_Out ON[tbl_BBG_Out].LOGIC_IND = tbl_BBG_Mapping.Status) 
AS mapper ON AA.CUSIP = mapper.ID_CUSIP) 
INNER JOIN tbl_SAG_Diff ON 
(AA.MSD_ID = tbl_SAG_Diff.MSD_ID) AND(AA.PRODUCT_ID = tbl_SAG_Diff.PRODUCT_ID) 
WHERE AA.Added_Date = tbl_SAG_Diff.RUN_DATE; 
+0

你有沒有添加索引? –

+0

你有沒有考慮簡化你的更新查詢? –

+0

此更新不能簡化更多。 我還沒有嘗試索引。我怎樣才能做到這一點? – Navid

回答

1

做在你的join不是使用括號沒有記錄爲什麼你正在做的。它可能會對查詢的運行方式產生重大影響,如果您不知道爲什麼要這麼做,請不要這樣做。這相當於使用查詢提示來強制連接順序。

Forcing Join Order Without Hints - Erik Darling

分享你的表模式,表的大小,使用Paste The Plan @ brentozar.com

不知道你的表模式和相關的DDL,或者看到一個執行計劃分享您的執行計劃...

update AA set 
    AA.Status_Flag    = mapper.Status_Flag 
    , AA.Review_Required_Flag  = mapper.Review_Required_Flag 
    , AA.Exemption    = mapper.CF_BB_Exemption 
    , AA.Bloomberg_Flag   = 'True' 
    , AA.Bloomberg_Classification = bbgOut.LOGIC_IND 
from AA 
    inner join tbl_SAG_Diff as sd 
    on AA.MSD_ID  = sd.MSD_ID 
    and AA.PRODUCT_ID = sd.PRODUCT_ID 
    /* moved this from the where to the join */ 
    and AA.Added_Date = sd.RUN_DATE 

    /* join the tables instead of this query, update aliases as needed in `set` */ 
    /* inner join ( 
    select * 
    from tbl_BBG_Mapping 
     inner join tbl_BBG_Out 
     on [tbl_BBG_Out].LOGIC_IND = tbl_BBG_Mapping.status 
    ) as mapper 
     on AA.CUSIP = mapper.ID_CUSIP 
    */ 
    inner join tbl_BBG_Mapping as mapper 
    on AA.CUSIP = mapper.ID_CUSIP 
    inner join tbl_BBG_Out as bbgOut 
    on mapper.status = bbgOut.LOGIC_IND 
+0

感謝SqlZim。我正在使用的映射器指向來自兩個表tbl_BBG_Mapping和tbl_BBG_Out的列。您提供的那個,只指向tbl_BBG_Mapping。 – Navid

+0

如何生成執行計劃? – Navid

+0

@Navid是的,這兩個表在我的版本中有不同的別名,因爲我注意到您需要在'set'中根據需要更新別名。我分別包含兩個表,注意別名'bbgOut'用於設置'AA.Bloomberg_Classification' – SqlZim