2010-05-04 4 views
1

.NET 용 MySql 커넥터를 사용하여 MySql 서버에서 SQL Server 2008로 데이터를 복사하고 있습니다.대량 전송을위한 MySqlDataAdapter 또는 MySqlDataReader?

다음 중 하나를 사용하여 더 나은 성능을 경험 한 사람이 있습니까?

  • 데이터 어댑터 다음, 그때 500 개 DataTable의 행을로드 SqlBulkCopy의를 사용하고 500

의 루프에서 DataTable을 500

  • DataReader.Read의 덩어리에서 DataTable을 채우기를 호출 MySql 레코드 세트가 완전히 전송 될 때까지 루핑을 계속하십시오.

    저는 주로 적당한 양의 메모리를 사용하고 짧은 시간 내에 완료하는 것에 관심이 있습니다.

    도움이 될 것입니다.

  • +0

    솔루션을 게시 하시겠습니까? 필자는 현재 MySQL에서 MSSQL으로 많은 양의 데이터를 이동해야하며 DataTable.Fill (MySQLDataReader)을 사용하여 데이터 테이블을 채울 때 OutOfMemoryException을 만나게됩니다. 당신의 솔루션은 저에게 많은 시간을 절약 해줍니다. – callisto

    답변

    2

    많은 양의 데이터를 처리 할 때 SqlBulkCopy를 DataReader와 함께 사용했습니다. 전체 데이터 세트가 복사되기 전에 검색되지 않기 때문에 프로세스가 속도와 메모리 사용면에서 상당히 효율적이라는 것을 알게되었습니다. BatchSize 속성을 적절한 값, 예를 들어 500으로 설정하는 것이 좋습니다.

    2

    나는 SqlBulkCopy를 사용하지 않았지만 일반적으로 DataReaders는 일반적으로 더 나은 성능을 제공합니다.

    기본 쿼리가 여전히 레코드를 반환하는 동안 DataReader를 처리 할 수 ​​있으므로 데이터 처리를 시작하기 전에 쿼리가 완료 될 때까지 기다릴 필요가 없습니다. DataReader는 사용 가능한 즉시 데이터를 반환 할 것이므로 기본적으로 전체 결과 집합이 아닌 활성 레코드 만 메모리에 저장하므로 메모리 사용량이 줄어 듭니다.

    DataAdapter는 정보가 메모리에 저장되는 방식과 추가 연결된 상태 (생각하면 rowstate 등)로 인해 오버 헤드가 높은 DataTable/DataSet에 전체 결과 집합을로드합니다.

    데이터를 읽는 중이라면 항상 DataAdapter를 통해 DataReader를 사용합니다 ... 누군가 내가 잘못한 부분이 있으면 저를 교정 해주십시오.

    관계없이 SqlBulkCopy는 레코드를 반복하는 것으로 나타나며 Reflector에 따라 최적화를 위해 DataTable을 사용하지 않으므로 DataReader가 최선의 방법이라고 생각합니다.

    관련 문제