2012-03-01 7 views
1

나는 임시 테이블에 엑셀 레코드의 대량을 업로드합니다. 그런 다음이 행을 합하여 PK로 주 테이블에 합산해야합니다.어느 것이 더 빠릅니까? 방아쇠를 삽입하거나 직접 저장 프로 시저

삽입 후 삽입 된 것이 메인 테이블에 이미 존재하는지 확인하는 트리거를 만들었습니다 (기존에 삽입하지 않으면 기존 행의 모든 ​​열이 업데이트 됨).

그래서 나는 다음 트리거가 기본 테이블에/업데이 트를 삽입 할 또 다른 임시 테이블

INSERT INTO TEMPTBL (select SUM(...)...* from temptable)

에 삽입하기 위해 필요한이 트리거를 트리거합니다.

이것이 적절한 방법인지, 아니면 단지 하나의 TEMP 테이블을 사용하는지 궁금 해서요. 그런 다음 SP를 사용하여 1 개의 커서 추출 (기존 행을 업데이트하는 경우)을 수행 한 다음 나머지 부분을 삽입하십시오.

미리 읽어 주셔서 감사합니다. 이들이 다중 사용자를 처리 할 것이기 때문에 어느 것이 이상적 일지/더 빨리 알 필요가 있습니다. (교착 상태는 아직 마음에 들지 않습니다.)

답변

3

건전한 절차 적 (행 단위), 하지만 당신이하고있는 일을 위해 세트 기반의 솔루션 (모든 레코드를 한 번에)이 있어야한다고 생각합니다.

트리거 또는 커서 대신 모든 레코드를 한 번에 삽입하고 삽입 문에 이미 테이블에있는 레코드를 제외하는 검사를 포함하십시오.

INSERT INTO YourTable (Column1, Column2...) 
SELECT Column1, Column2... 
FROM TempTable tt 
WHERE NOT EXISTS (
    SELECT 1 
    FROM YourTable yt 
    WHERE tt.ID = yt.ID 
) 

편집 :처럼 뭔가 당신의 업데이트에 대한

, 당신은 비슷한 일을 할 수 있습니다. 삽입하기 전에 임시 테이블을 기존 테이블에 조인하고 일치하는 레코드를 업데이트하십시오.

UPDATE yt 
SET Column1 = tt.Column1, Column2 = tt.Column2 
FROM 
    YourTable yt JOIN 
    TempTable tt ON tt.ID = yt.ID 
+0

내 INSERT 파트에 대해 SP에서 수행 한 작업입니다. 문제는 업데이트가 될 것입니다. 기존 행의 일부 열을 업데이트해야합니다. – Sid

+0

나는 내가 DELETE * FROM WHERE 행을 사용하고 있다고 생각한다. 그런 다음 나머지 부분에 삽입하십시오. 그게 괜찮을까요? 또한 사용자가 수천 개의 행을 업로드 할 수 있기 때문에 어떻게 로그를 최소화 할 수 있습니까? 나는 TRUNCATE TABLE을 사용할 것이지만, 최근에 업로드 된 다른 사용자의 데이터를 즉시 자르지 않을까 걱정됩니다. : D – Sid

+1

@sid 처음에는 수천 개의 행이 많은 것처럼 보였지만 SQL Server는 수백만 개를 처리 할 수 ​​있도록 만들어졌습니다. 깨끗한 세트 기반 방식을 취하는 한 성능에 대해 너무 걱정할 필요가 없다고 생각합니다. 이를 염두에두고 업데이트 문은 삭제/삽입보다 적은 로그 항목을 생성합니다. 나는 당신이 모든 것을자를 필요가 있다고 생각하지 않는다. 당신의 임시 테이블은 연결마다 있어야하고, 당신이 끝나면 자동으로 정리 될 것이다. 봐. –

관련 문제