Azure 테이블에서 약 2 천 5 백만 행을 Azure 테이블 저장소의 세 가지 테이블로 대량로드하려고합니다. 저는 현재 50-100 행/초를 처리하고 있습니다. 즉, 현재 속도로로드를 완료하는 데 약 70-140 시간이 걸릴 것입니다. 그것은 오랜 시간이며, 속도를 높이는 것이 가능해야하는 것처럼 보입니다.Azure 테이블 저장소 대량로드의 성능 향상
는- 킥 오프 10 개 별도의 작업을 각 작업에 대한 , 세 대상의 각각에 대한 SQL DB
- 에서 다음 만 개 처리되지 않은 기록을 읽어 테이블을 ATS : 여기 내가 뭘하는지입니다 해당 테이블의 파티션 키로 10,000 레코드를 그룹화하십시오.
- 병렬로 (동시에 최대 10 개) 각 파티션 키에 대해 파티션을 (최대) 100 개의 행 세그먼트로 분할
- 병렬로 10 동시에) 각 세그먼트에 대해 새
TableBatchOperation
을 만듭니다. 청크의 각 행에 대해
,
- 이 배치를 실행 비동기
- 린스와 반복 (일부 데이터가 이미로드되어 있기 때문에, 나는 어떤을 모르는)을 batch.InsertOrReplace() 문을 실행
일부 노트 (흐름 제어, 오류 검사 등의 많은) :
- 나는까지 위의 여러 숫자에 대해 서로 다른 매개 변수의 많은이 여러 가지 방법을 시도하고, 한 나는 아직도 g가 아니다. 10-20ms/event 이하로 떨어 뜨린다.
- 로드하는 VM이 평균 약 10-20 % CPU이기 때문에 CPU 바인딩되지 않은 것 같습니다.
- SQL select 문은 연산의 가장 빠른 부분이므로 적어도 두 개의 순서로 SQL 바인딩 된 것처럼 보이지 않습니다.
- 일괄 처리를 실행하는 VM이 동일한 데이터 센터 (미국 서부)에 있기 때문에 네트워크에 연결되지 않은 것으로 추정됩니다.
- 합리적인 파티션 밀도를 얻고 있습니다. 즉, 각 10K 레코드 세트가 각 테이블에 대해 수백 개의 파티션으로 나뉘어져 있습니다.
- 완벽한 파티션 밀도를 사용하면 최대 3000 개의 작업 (10 개의 마스터 작업 * 3 개의 테이블 * 10 개의 파티션 * 10 개의 세그먼트)을 동시에 실행할 수 있습니다. 그러나 그들은 비동기 적으로 실행되고 있으며 거의 모든 I/O 바인딩 (ATS에 의해)이므로 프로세스를 실행하는 VM에 대한 스레딩 제한을 초과하지는 않습니다. 우리는 일괄 삽입에 대한 완벽한 파티션 밀도를 얻을 수 있도록
내가 가지고 올 수있는 유일한 명백한 아이디어는 내가 SQL SELECT 문에 order by
파티션 키를 수행하는, 즉, 이전에 시도 하나 . 어려운 이유가 여러 가지 이유로, 테이블의 인덱스가 그걸 위해 준비되지 않았기 때문입니다. 그리고 일부는이 ATS 측에서 그 접근법을 사용하여 속도를 높이는 것을 기대할 수 있습니다. 이미 파티션 키를 사용하여 10K 레코드를 그룹화 했으므로 훨씬 많은 성능 향상을 기대할 수 없습니다.
과속을 빨리 방지하기위한 다른 제안 사항이 있습니까? 아니면 다른 사람이 얻을 수있는만큼 빨리 할 수 있습니까?
이 링크는 찾고있는 정보를 제공합니다. http://leiliweb.wordpress.com/2012/12/11/partitioned-table-and-index-strategies-using-sql-server-2008/ –
@ J.Davidson - 제안 해 주셔서 감사합니다.하지만 SQL Server *에 대한 파티션 전략에 대해 이야기하고 Azure 테이블 저장소에 문제가 있습니다. 오히려 다른 짐승 :-). –