7

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

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

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

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

답변

4

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

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

실제로 종종 가져 오기와 동시에 큰 그룹 - 바이 쿼리를 실행하는 것은 불가능합니다. SQL Azure는 서비스 품질을 보장하기 위해 많은 작업을 수행합니다. 너무 오래 걸리거나 너무 많은 리소스를 사용하는 등의 요청 시간 초과를 포함합니다.

이렇게 여러 개의 대량 대량 삽입을 동시에 수행하면 일 것입니다.은 타임 아웃.

+1

엉덩이 매트 말한다. 처리량은 나에게 맞았다. 클러스터형 인덱스를 제외하고 테이블에 인덱스가 없는지 확인하십시오. –

+4

나는 임시 테이블에 병렬로 삽입하고 그 임시 테이블에서 주 테이블로 (직렬로) 삽입하는 작업을 마쳤습니다. 임시 테이블에서의 삽입이 약 2 백만 행에 대해 4-5 분이 걸렸으므로 저에게는 훨씬 빠른 것처럼 보였습니다. – kyliod

1

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

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

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