programing

SQLBulkCopy에 권장되는 배치 크기는 어떻게 됩니까?

showcode 2023. 4. 15. 09:42
반응형

SQLBulkCopy에 권장되는 배치 크기는 어떻게 됩니까?

권장되는 배치사이즈는 무엇입니까?SqlBulkCopy퍼포먼스 튜닝의 시작점으로 사용할 수 있는 일반적인 수식을 찾고 있습니다.

SQL Server 인스턴스와 동일한 물리적 서버에 Import 유틸리티가 있습니다.커스텀 사용IDataReader플랫 파일을 해석하여 데이터베이스에 삽입합니다.SQLBulkCopy. 일반적인 파일에는 약 6M의 정규화된 행이 있으며, 평균 5열의 10진수 및 짧은 텍스트로 행당 약 30바이트가 있습니다.

이 시나리오에서는 5,000의 배치 사이즈가 속도와 메모리 소비량의 최적의 타협점임을 알 수 있었습니다.처음에는 500으로 시작해서 더 큰 것을 실험했습니다.5000이 500보다 평균 2.5배 더 빠르다는 것을 알게 되었습니다.600만 행을 삽입하려면 배치 크기가 5,000인 경우 약 30초, 배치 크기가 500인 경우 약 80초가 소요됩니다.

10,000은 눈에 띄게 빠르지 않았다.50,000까지 이동하면 속도가 몇 %포인트 향상되지만 서버에 대한 부하가 증가할 필요는 없습니다.5만 명 이상이 속도 향상을 보이지 않았다.

이것은 공식은 아니지만 사용자가 사용해야 할 또 다른 데이터 포인트입니다.

저도 이 문제에 대해 좀 더 알아보고 있습니다.C# 콘솔 애플리케이션(.)을 사용하여 SQL Server 2005 데이터베이스로의 대용량 CSV 파일(16 GB 이상, 6500만 개 이상의 레코드 및 증가) Import를 최적화하려고 합니다.넷 2.0).Jeremy가 이미 지적와 같이, 특정 상황에 따라 미세 조정이 필요하지만, 초기 배치 사이즈는 500이고, 그 이상과 이하의 테스트 값은 모두 테스트하는 것이 좋습니다.

MSDN 포럼 투고에서 100~1000의 값을 배치 사이즈로 테스트하는 것을 추천받았는데 회의적이었습니다.그러나 100에서 10,000 사이의 배치 크기를 테스트한 결과, 500이 내 애플리케이션에 가장 적합한 값임을 알 수 있었습니다.500의 값SqlBulkCopy.BatchSize여기서도 추천합니다.

SqlBulkCopy 작업을 더욱 최적화하려면 이 MSDN 조언을 확인하십시오. SqlBulkCopyOptions를 사용하면 됩니다.TableLock은 로딩 시간을 단축하는 데 도움이 됩니다.

다른 사용자가 언급했듯이, 이는 사용자 환경, 특히 행 볼륨과 네트워크 지연 시간에 따라 달라집니다.

개인적으로는, 저는 우선 이 세팅하는 것부터 시작할게요.BatchSize속성을 1000 행으로 설정하고 동작을 확인합니다.동작하면 타임아웃이 될 때까지 행의 수를 2배로 늘립니다(예를 들어 2000, 4000 등).

그렇지 않으면 1000에서 타임아웃이 발생하면 작동할 때까지 행 수를 절반(예: 500)으로 줄입니다.

어느 경우든, 스위트 스팟을 찾을 때까지, 마지막에 시도했던 배치 사이즈의 차이를 2배(성공했을 경우) 또는 2배(실패했을 경우)로 계속 반감합니다.

고려해야 할 또 다른 요인은 의 단일 배치를 복사하는 데 걸리는 시간입니다.복사할 행 배치가 속성(기본값 30초)을 초과하면 시간 초과가 발생합니다.두 배로 더 해보는 게 어때?BulkCopyTimeout60달러따라서 더 큰 배치 행 세트를 복사하는 데 더 오랜 시간이 걸립니다.예를 들어 50,000행의 배지는 제한시간인 30초를 조금 넘는 40초 정도 걸릴 수 있으므로 최대 60초까지 범핑하면 퍼포먼스에 도움이 됩니다.

이 모든 것은 고객의 구현에 달려 있습니다.

네트워크에서는 어느 정도의 속도를 기대할 수 있습니까?폼 또는 ASP 중 어느 쪽에서 사용하고 있습니까?넷? 진행 상황을 사용자에게 알려야 합니까?전체 작업 규모가 얼마나 됩니까?

지금까지의 경험에서는, 일괄 카피를 일괄적으로 실행했을 경우, 타임 아웃의 문제가 발생합니다.저는 1000개 정도의 레코드로 시작해서 거기서부터 몇 가지 조정을 하는 것을 좋아합니다.

@Alric이 제안하는 가치관은 나에게 매우 보수적으로 보인다.

저는 지금 진행 중인 프로젝트의 일환으로 10,000, 100,000, 100,000의 배치 크기를 시도했습니다.수신처 테이블은 클러스터 컬럼스토어 bigint, int, int, int, date, decimal(32,15)입니다.

BatchSize
10,000       100,000      1,000,000
3:31:25 PM   3:28:43 PM   3:36:57 PM
3:35:24 PM   3:29:38 PM   3:37:44 PM
3.983333332  0.916666671  0.783333328    (minutes)

SSMS 액티비티 모니터가 5초간 갱신했을 때, 이 데이타베이스의 기입이 4 MB/초 미만으로 표시되었습니다.에겐 낮게 느껴지지만, 제 기대치를 어떻게 정확하게 보정해야 할지 잘 모르겠어요.

나는 여러 사이즈를 써봤는데, 내 경우는 5000이 좋았다.

언급URL : https://stackoverflow.com/questions/779690/what-is-the-recommended-batch-size-for-sqlbulkcopy

반응형