내 옵션은 하루에 SQL Server에 업데이트를 삽입하는 데 약 30M 행이 있습니까?

azure-sql-database c# sqlbulkcopy

문제

내 옵션은 하루에 SQL Server에 업데이트를 삽입하는 데 약 30M 행이 있습니까?

SqlBulkCopy를 사용하면 이미 존재하는 데이터를 삽입하지 못하도록 처리합니까?

내 시나리오에서는 데이터를 복제하지 않고 동일한 데이터를 반복해서 실행할 수 있어야합니다.

지금은 DataTable에서 데이터를 읽는 insert 문과 업데이트 문이있는 저장 프로 시저가 있습니다.

더 나은 성능을 얻으려면 무엇을 찾고 있습니까?

수락 된 답변

이런 식으로하는 일반적인 방법은 제약이없는 영구적 인 작업 테이블을 유지하는 것입니다. 종종 이들은 동일한 서버의 별도 작업 데이터베이스에있을 수 있습니다.

데이터를로드하려면 작업 테이블을 비우고 BCP / 대량 복사를 통해 데이터를 분사하십시오. 데이터가로드되면 새로로드 된 데이터를 준비하는 데 필요한 정리 및 / 또는 변환을 수행합니다. 일단 완료되면 마지막 단계로서 이전 데이터와 새 테이블 사이의 델타를 구현하는 데 필요한 업데이트 / 삭제 / 삽입 작업을 수행하거나 실제 테이블을 자르고 다시로드하여 데이터를 실제 테이블로 마이그레이션합니다.

또 다른 옵션은 일정한 데이터 흐름이 닮은 경우 데몬을 설정하여 데이터 도착을 모니터링 한 다음 삽입을 수행하는 것입니다. 예를 들어, 데이터가 플랫 파일 인 경우 FTP 등을 통해 디렉토리로 떨어 뜨린 경우 데몬은 변경 사항이 있는지 디렉토리를 모니터링하고 물건이 도착할 때 위와 같이 필요한 작업을 수행 할 수 있습니다.

고려해야 할 것은 프로덕션 시스템 인 경우 대량 인서트 / 삭제 / 업데이트 문을 수행하면 트랜잭션이 진행되는 동안 차단이 발생할 가능성이 높습니다. 또한 거대한 트랜잭션 실패 및 롤백에는 자체 단점이 있습니다.

  • 롤백은 처리하는 데 꽤 오래 걸릴 수 있습니다.
  • 잠금은 롤백이 지속되는 동안 보관되므로 데이터베이스에서 차단 및 기타 경쟁이 발생할 수 있습니다.
  • 최악의 경우 모든 일이 끝나면 앞으로 나아갈 수있는 움직임을 얻지 못했습니다. 말하자면, 많은 시간과 노력을 들여야합니다.

따라서 상황에 따라 더 작은 배치로 삽입 / 업데이트 / 삭제를 수행하는 것이 좋습니다. 그러면 앞으로 진행될 수 있습니다. 24 시간 동안 3 천만 행이 나올 것입니다. 초당 350


인기 답변

보류 테이블에 대량 삽입 한 다음 단일 병합 문 또는 업데이트 및 삽입 문을 수행하십시오. 어느 방법을 사용하든 소스 테이블과 보유 테이블을 비교하여 수행 할 작업을 확인하십시오



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