답변:
OLE DB 대상 구성 요소의 데이터 액세스 모드는 빠르거나 빠르지 않은 두 가지 방식으로 제공됩니다.
"테이블 또는 뷰-빠른로드"또는 "테이블 또는 뷰 이름 변수-빠른로드"는 데이터가 설정된 방식으로로드됨을 의미합니다.
느리게- "테이블 또는 뷰"또는 "테이블 또는 뷰 이름 변수"는 SSIS가 데이터베이스에 싱글 톤 삽입 문을 발행하게합니다. 10, 100, 심지어 10000 행을로드하는 경우 두 방법 사이에 눈에 띄는 성능 차이가 거의 없습니다. 그러나 언젠가는 약간 까다로운 요청으로 SQL Server 인스턴스를 포화 상태로 만들 것입니다. 또한 트랜잭션 로그에서 도용을 남용 할 것입니다.
왜 빠른 방법을 원하지 않습니까? 나쁜 데이터. 10000 행의 데이터를 보내고 9999 번째 행의 날짜가 2015-02-29이면 10k 원자 삽입 및 커밋 / 롤백이 있습니다. Fast 방법을 사용하는 경우 10k 행의 전체 배치가 모두 저장되거나 저장되지 않습니다. 그리고 어떤 행에서 오류가 발생했는지 알고 싶다면 가장 낮은 수준의 입도는 10k 행입니다.
이제는 가능한 한 빨리 많은 데이터를로드하고 더티 데이터를 처리하는 방법이 있습니다. 그것은이다 계단식 실패 접근 방식과는 같이 보입니다
아이디어는 한 번에 가능한 한 많이 삽입 할 수있는 올바른 크기를 찾는 것이지만 잘못된 데이터를 얻는 경우 데이터를 연속적으로 작은 배치로 다시 저장하여 잘못된 행에 도달하려고합니다. 여기서는 최대 삽입 커밋 크기 (FastLoadMaxInsertCommit)를 10000으로 시작했습니다. 오류 행 처리 Redirect Row
에서에서로 변경합니다 Fail Component
.
다음 목적지는 위와 동일하지만 빠른로드를 시도하고 100 행의 배치로 저장합니다. 다시 말하지만, 적당한 크기로 테스트하거나 준비하는 것이 좋습니다. 그 결과 어딘가에 알기 때문에 100 개의 행으로 100 개의 배치가 전송 됩니다. 테이블의 무결성 제약 조건을 위반 한 행이 하나 이상 있습니다.
그런 다음 믹스에 세 번째 구성 요소를 추가합니다. 이번에는 일괄 처리로 1을 저장합니다. 또는 동일한 결과를 얻을 수 있으므로 빠른 액세스 버전에서 테이블 액세스 모드를 변경할 수 있습니다. 우리는 각 행을 개별적으로 저장하여 단일 불량 행으로 "무언가"를 수행 할 수 있습니다.
마지막으로 비상 안전 대상이 있습니다. 아마도 대상과 "동일한"테이블 일 수도 있지만 모든 열은로 선언됩니다 nvarchar(4000) NULL
. 해당 테이블에서 결과가 무엇이든 조사하고 정리 / 삭제하거나 나쁜 데이터 분석 프로세스가 무엇이든해야합니다. 다른 사람들은 플랫 파일로 덤프하지만 실제로는 잘못된 데이터 작업을 추적하는 방법에 적합한 모든 것이 있습니다.
가져온 데이터 파일에서 ID 값을 유지하거나 SQL Server에서 할당 한 고유 값을 사용하십시오.
벌크로드 조작 중에 널값을 유지하십시오.
대량 가져 오기 조작 중 대상 테이블 또는 뷰의 제한 조건을 확인하십시오.
벌크로드 조작 동안 테이블 레벨 잠금을 확보하십시오. 배치의 행 수와 커밋 크기를 지정하십시오.
차이점은 무엇입니까? 내가 알 수있는 유일한 차이점은 빠른로드가 데이터를 훨씬 빠르게 전송한다는 것입니다.
후드 아래에서 table or view
삽입 할 모든 행에 대해 개별 SQL 명령을 table or view - with fast load
사용하고 BULK INSERT 명령을 사용합니다.
BULK INSERT 에서 사용할 수있는 위의 옵션이 표시되면 예를 들어 number of rows in the batch
= ROWS_PER_BATCH
및 commit size
=BATCHSIZE
또 다른 시나리오는 ..
기본 최대 삽입 커밋 크기 (2147483647)가 너무 높습니다. 예를 들어 500K 행을 삽입하고 PK 위반으로 인해 배치가 실패합니다. 이 시나리오에서는 FAST LOAD 옵션을 사용하면 전체 배치가 실패합니다. 오류 설명도 얻을 수 없습니다.
여기에서 table or view
대상 오류 출력으로 사용할 수 있습니다 . 따라서 500K 중에서 삽입 커밋 크기 5K부터 FAST LOAD를 사용합니다. 해당 배치의 1 행이 실패하면 5K 배치를 table or view
로드로 리디렉션합니다 .5K 행에 대해서만 행 단위 삽입을 사용 table or view
하고 플랫 파일로 오류를 리디렉션 할 수 있습니다 . 5K 인 경우 오류의 원인을 정확히 파악할 수 있습니다.
위의 방법의 장점은 행 중 하나라도 실패하지 않으면 전체 배치에 대해 BULK INSERT (고속로드)를 사용한다는 것입니다.
SSIS 애호가 billinkc 는 Stackoverflow에 대해 비슷한 질문에 답변했습니다 .