SqlBulkCopy 및 Azure를 사용한 병렬 대량 삽입

azure azure-sql-database database parallel-processing sqlbulkcopy

문제

SQL Azure 데이터베이스가있는 구름에 푸른 색 응용 프로그램이 있습니다. 나는 BCP 또는 SSIS를 직접 사용할 수 없도록 파일 (최대 3 천만 행)을 처리하는 데 필요한 작업자 역할이 있습니다.

저는 현재 SqlBulkCopy를 사용하고 있습니다. 그러나 이것은 400k 행에 대해 최대 4-5 분의로드 시간을 보았을 때 너무 느립니다.

대량 삽입물을 병렬로 실행하고 싶습니다. 그러나 데이터를 병렬로 가져 오거나 잠금 동작을 제어하는 ​​기사를 읽는 동안 SqlBulkCopy를 사용하려면 테이블에 클러스터 된 인덱스가없고 테이블 잠금 (BU 잠금)을 지정해야한다고합니다. 그러나 azure 테이블에는 클러스터 된 인덱스가 있어야합니다.

SQL Azure의 동일한 테이블에서 SqlBulkCopy를 병렬로 사용할 수 있습니까? 그렇지 않다면 코드에서 사용할 수있는 다른 API가 있습니까?

수락 된 답변

SqlBulkCopy를 사용하는 것보다 빠르게 실행할 수있는 방법이 없습니다. 우리 프로젝트에서는 약 3 분 안에 250,000 개의 행을 가져올 수 있으므로 요금이 적당 할 것 같습니다.

비록 기술적으로 가능하다 할지라도 그것을 병렬로하는 것이 도움이 될 것이라고 나는 생각하지 않는다. 한 번에 하나의 가져 오기 만 실행합니다. 그렇지 않으면 SQL Azure가 요청을 시간 초과하기 시작합니다.

실제로 때때로 가져 오기와 동시에 큰 그룹 별 쿼리를 실행하는 것은 불가능합니다. SQL Azure는 서비스 품질을 보장하기 위해 많은 작업을 수행합니다. 여기에는 너무 오래 소요되는 요청 시간 초과, 너무 많은 리소스 소요 등이 포함됩니다.

그래서 아마 시간 일을하게됩니다 동시에 여러 대형 대량 삽입을하고.


인기 답변

같은 테이블을로드하더라도 SQL Azure에 대해 SQLBulkCopy를 병렬로 실행할 수 있습니다. SQLBulkCopy API로 보내기 전에 레코드를 일괄 적으로 준비해야합니다. 이는 성능에 절대적으로 도움이되며, 자신이 수행하지 않은 이유로 인해 제한된 속도로 줄어들 때 작은 레코드 배치에 대한 재시도 작업을 제어 할 수 있습니다.

다양한 접근 방식의로드 시간을 비교하는 블로그 게시물을 살펴보십시오. 샘플 코드도 있습니다. 별도의 테스트에서 나는 테이블의로드 시간을 절반으로 줄일 수있었습니다.

이것은 몇 가지 도구 (Enzo Backup, Enzo Data Copy)에 사용하고있는 기술입니다. 간단한 일은 아니지만 올바르게 완료되면로드 시간을 크게 최적화 할 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.