2014-12-22 2 views
1

예약 된 배치 스크립트의 일부로 업데이트되는 준비 테이블이 있습니다.다른 테이블에 존재하지 않는 테이블에 대한 레코드를 얻으려면 어떻게합니까?

내가 Staging_Table의 항목으로 상정라는 Product_Table를 업데이트 매일 이제이 테이블

Staging_Table

를 호출 할 수 있습니다. 스테이징 테이블의 항목이없는 Products_Table의 행을 삭제해야합니다.

이제 스테이징 테이블은 97000 개의 레코드를 보유하고 있지만 producst 테이블에는 7000 개 밖에 없습니다. 그러나 매일 매일 논리적 테이블의 항목은 97000까지 올라갑니다. TDC_IDP_ID라는 제품에 대한 키가 있습니다. .

그래서 나는이 영원히 실행하는 데 걸리는 것 같다 쿼리 ...

DELETE FROM Product_Table 
     WHERE PRODUCT_TD_PARTCODE NOT IN (SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID) 

이제 내부 쿼리가 97,000 레코드가 있습니다. 어떻게하면이 쿼리를 가장 잘 실행할 수 있습니까? 아니면이 문제를 해결할 다른 방법이 있습니까? 선택 대신 내가 다음 쿼리를 시도하고 내가이 질문을 입력으로 실행됩니다.

SELECT COUNT(*) 
FROM Product_Table PT 
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID 
WHERE ST.TDC_TD_PARTCODE IS NULL 

DELETE PT 
FROM Product_Table PT 
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID 
WHERE ST.TDC_TD_PARTCODE IS NULL 
+0

스테이징 테이블에 인덱스가 있습니까? – SMA

답변

1

첫째, 같은 인덱스를 바꿔 : 그

SELECT COUNT(*) 
     FROM Product_Table 
     WHERE PRODUCT_TD_PARTCODE NOT IN (SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID) 
1

사용 LEFT이 시도

IN 대신 의를 NOT 가입 ....이 실행되고 있는지 11분하고 not exists :

DELETE FROM Product_Table 
    WHERE NOT EXISTS (SELECT 1 
         FROM Staging_Table st 
         WHERE st.TDC_IDP_ID = @TDC_IDP_ID AND 
          st.TDC_TD_PARTCODE = product_table.PRODUCT_TD_PARTCODE 
        ); 

그런 다음 당신이 준비 테이블에 인덱스 원하는 :

create index idx_Staging_Table_2 on Staging_Table(TDC_TD_PARTCODE, TDC_IDP_ID); 
0

당신이 LEFT JOIN을 사용해야합니다 이러한 무거운 데이터 및 '/ NOT IN IN'다른 우선을 실행 시간은 실행하기 위해 너무 무거운 쿼리를 만들 것 더 많을 것이다. 조인을 사용하면 더 빠른 실행을 제공합니다. 귀하의 경우에는 왼쪽 조인을 사용하십시오.

관련 문제