각 행을 처리하고 C #을 사용하여 새 테이블에 복사합니다.

c# sqlbulkcopy sql-server sql-server-2008

문제

몇 백만 레코드가있는 MSSQL 2008 테이블이 있습니다. 각 행을 반복하고 일부 데이터를 수정 한 다음 매일 업데이트되는 C # 응용 프로그램을 사용하여 업데이트 된 레코드를 새 테이블에 복사해야합니다.

ADO.NET 엔티티를 사용하여이 작업을 시도했지만이 방법과 관련된 메모리 문제가 있지만 느린 것은 아닙니다. 하나의 테이블을 다른 테이블에 복사하는 대량 복사 라이브러리 및 SQL 전용 방법에 대해서는 읽었지만 복사하기 전에 레코드를 수정하는 방법은 없습니다. 이 작업을 수행하는 더 좋은 방법을 찾아야합니다.

수락 된 답변

메모리 문제를 언급하면서 수백만 행을 메모리에로드하고 처리 한 다음 다시 데이터베이스에 기록하려고합니다. 데이터를 완전히로드하는 대신 '스트리밍'하여이를 피할 수 있습니다. SqlDataReader 는 버퍼링을 처리 할 것이므로 읽기 측에서 하나씩 로우를 가져 오는 간단한 WHILE 루프를 수행 할 수 있습니다. 실제로 작업 한 실제 변환은 결과를 데이터베이스에 다시 쓰는 것만 큼 신경 써야합니다. IMHO를 사용하는 가장 빠른 방법은 데이터 테이블에서 여러 결과의 버퍼를 저장 (100으로 시작하고 스위트 스폿이있는 곳을 확인) 한 다음 SqlBulkCopy 클래스를 사용하여 해당 데이터 테이블을 데이터베이스로 푸시하는 것입니다. 린스 & 반복.

추신 : '재미'같은 소리. 이 데이터를 테스트 할 샘플 데이터가 있습니까? 5 시간은 처음에는 사소한 것처럼 보이기까지 오랜 시간처럼 들린다. 그리고 나서 2 천만 번은 사실상 아무 것도 추가되지 않는다. 좀 더 구체적으로 말하면 데이터가 RTF 측면에서 얼마나 큰지 궁금합니다. 평균적으로 약 2k 정도의 값이 있습니까? 어떤 종류의 하드웨어를 사용합니까?


인기 답변

가장 빠른 수행 옵션은 C # 응용 프로그램 논리를 CLR 저장 프로 시저 에 다시 작성하여 모든 처리가 서버에서 수행 되도록하는 것입니다.



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