2017-02-13 3 views
0

몇 개의 내부 조인을 포함하는 "업데이트"문이 있습니다. 400K 행에서 실행하고 실행하는데 약 11 분이 소요됩니다. 나는 Access db에 대해서 같은 문장을 실행하는데 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

공유 테이블 스키마, 테이블 크기, 실행 계획을 테이블 스키마 및 관련 DDL을 알고, 또는 보지 않고 Paste The Plan @ brentozar.com

사용하여 실행 계획을 공유 ...

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'에서 필요에 따라 업데이트해야합니다. 두 테이블을 개별적으로 포함 시켰습니다. 'AA.Bloomberg_Classification'설정을위한 별명'bbgOut'을 알려주십시오. – SqlZim