2017-02-13 62 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