2017-01-25 1 views
0

테이블에 많은 레코드 (약 2 ~ 3 백만)를 삽입해야한다는 요구 사항이 있습니다. 그러나 우리는 유효하지 않은 레코드 (기본 키, 외래 키 및 비 null 위반)를 나중에 참조 할 수 있도록 별도의 오류 테이블에 유효성을 검사하고 분리 할 수 ​​있어야합니다. 필자의 연구에 따르면 SQL 서버의 대량 삽입은 삽입에 적합하지만 잘못된 데이터 레코드를 필터링하는 가장 좋은 방법을 찾아 내지 못합니다. 도움 사이에 스테이징 테이블을 가지고 있습니까? 스테이징 테이블에 대해 대기열을 사용하여 위반 사항을 확인할 수는 있지만 실제 레코드에 다른 레코드를 삽입해야합니다 (삽입 선택 또는 병합을 통해). 그러나 이것이 효율적인 접근 방법입니까? 나는 2x 인서트를하는 것과 비슷하기 때문에 걱정이된다.데이터 유효성 확인이 포함 된 대량 삽입

.net sqlbulkcopy를 사용하여 대량 삽입을 수행 할 계획이며 명확한보고 오류도 없습니다.

누군가 좀 효율적으로 해결책을 제시 할 수 있습니까?

편집 :이 방법이 유일한 해결책 인 경우 두 번째 삽입물에 가장 적합한 방법은 무엇이라고 생각하십니까? 삽입 ... 선택 또는 병합입니까? BULK INSERT의 효율성과 속도와 일치합니까? 아니면 다른 대안이 있습니까?

감사합니다!

+0

여기에는 몇 가지 접근 방법이 있습니다. http : //stackoverflow.com/questions/1004525/sqlbulkcopy-error-handling-continue-on-error – TheGameiswar

+0

@TheGameiswar 링크를 제공해 주셔서 감사합니다. 나는 그것을 통과했고 실제로 두 번째 옵션은이 시나리오에서 적용 가능하다고 생각하는 것입니다. 그러나 소스에서 스테이징 테이블로, 그리고 스테이징 테이블에서 대상으로 각각 한 번씩 대량 삽입 할 때 효율적이라고 확신 할 수 없습니다. 최적화를위한 추가 기회가 있는지 알고 싶었습니다. –

+0

@TheGameiswar는 두 번째 단계를 수행하는 가장 좋은 방법에 대한 의견 수집에 관한 질문을 편집했습니다. 감사! –

답변

1

개인적으로 나는 2/3M 레코드를 대량으로 간주하지 않습니다. 몇 초 내에 데이터가 필요하지 않으면 단일 (비 벌크) 삽입이 적절하게 수행됩니다.

src 데이터 품질에 신경이 쓰이는 경우 - 먼저 stg 테이블에로드 한 다음 "Soft RI"를 수행하십시오. - SQL을 사용하여 PK, UQ, FK 등을 확인하십시오. Numeric/non-Numeric 또는 나쁜 날짜 형식 문제가 걱정된다면 모든 Cols에 대해 Stg 테이블 VARCHAR (8000)을 만들고 테이블에서 읽을 때 TRY_CONVERT를 사용합니다.

일단 데이터가 STG에 있으면 올바른 행만 필터링하고 불량 행을 자세히보고 할 수 있습니다.

+0

@ johnMcTighe 의견 주셔서 감사합니다. 우리의 SLA가 1 분당 약 1 백만 건이 될 것이라고 말할 수 있습니다. 대량 삽입시 더 좋지 않습니까? 또한 나쁜 레코드 분리와 별도로 좋은 테이블을 실제 테이블에 삽입해야합니다. 그렇다면이 단계에서 가장 효율적인 SQL 문은 무엇일까요? –

+0

좋아, 나는 이것을 시도 할 것이다 : STG에 삽입 - 이것은 당신이 충분히 행이로드됩니다 (아니 PKs, 제약 등)로 합리적으로 될 대량 삽입 수 있습니다 - 또한 STG 테이블은 각로드 전에 비어있을 것입니다. 그런 다음 어떤 이유로 든 유효하지 않은 Stg의 행을 업데이트하십시오 - 이것은 여러 번이 될 수 있습니다. 좋은 행을 간단한 삽입/선택 - 나중에 잘못된 행에 대한 별도의 쿼리로 삽입하십시오. 이것이 충분히 빨리 달리는 경우에 중대한! –

+0

@ john McTighe 충분히 빠르길 바랍니다! 나는이 질문을 다른 사람들이 어떤 생각을 가지고 있는지 좀 더 많은 시간을두고 대답하지 않을 것입니다. 그렇지 않은 경우 귀하의 답변을 답으로 표시합니다. 도와 주셔서 감사합니다! –

관련 문제