2012-06-29 1 views
1

세부 테이블에서 SQL Server 내 요약 테이블로 많은 양의 삽입 작업을 수행하고 있습니다. 나는이 방법은 상당한 양의 소요 것으로 나타났습니다이미 존재하는지 여부에 따라 INSERT를 수행하는 가장 효율적인 방법은 무엇입니까?

INSERT INTO TableA 
     (columnA 
     ,columnB 
     ,columnC) 
SELECT 
    b.columnA, 
    b.columnB, 
    b.columnC 
FROM TableB b 
    LEFT OUTER JOIN TableA a 
     on a.columnA = b.columnA 
WHERE 
    a.columnA IS NULL 

: 저는 현재 아래의 예처럼 삽입하기 전에 LEFT OUTER는 세부 테이블에서 행이 이미 요약 테이블에 존재하는지 확인하는 조인 사용하고 있습니다 이미 존재하는 것을 판별하기 위해 모든 행을 비교해야하기 때.에 삽입 할 행이없는 경우에도 시간이 필요합니다. 이 시나리오에서는 일반적으로 어떤 행이 삽입되었는지를 알려주기 위해 플래그를 TableB에 추가하는 것을 고려합니다.

그러나 여러 플래그를 필요로하고 TableB가 매우 크고 대형화와 같이 내가 저장 공간을 사용하지 선호 TableA에 삽입 할 TableB의 행에 대한 여러 가지 시나리오가 있습니다.

어떤 조언을 주셔서 감사합니다.

+0

대신 병합 문을 사용하려고 했습니까? 나는 SQL Server가이를 사용할 때 몇 가지 추가 최적화를 수행한다고 생각한다. – mfussenegger

+1

또한 이러한 테이블에 PK와 인덱스를 표시 할 수 있습니까? –

답변

3
INSERT INTO TableA (columnA, columnB, columnC) 
SELECT 
    b.columnA, 
    b.columnB, 
    b.columnC 
FROM TableB as b 
where not exists (select 1 from TableA as xx where xx.columnA = b.columnA) ; 
+0

와우, 좋은 제안. 나는 현재 삽입 할 레코드가없는 내 작은 스크립트 중 하나를 변경했으나 이전에는 여전히 실행하는 데 거의 3 분이 걸렸고 메서드를 적용한 후에는 1 초가 걸렸습니다. 감사! "exist"키워드를 완전히 이해하지 못했을 것 같습니다. – Troy

관련 문제