0

수백만 개의 행이있는 테이블이 있습니다. 로깅 데이터가 있습니다. 데이터를 텍스트 파일로 옮기고 싶습니다. 매일 데이터의 가치는 자체 텍스트 파일로 이동해야합니다. 나는 .net 환경에있어. 그것을 성취하는 효율적인 방법은 무엇입니까?.net 및 병렬 처리를 사용하여 SQL - 텍스트 아카이브

많은 코어가있는 힘이있는 서버가 있기 때문에 병렬 처리를 사용하고 싶습니다. 내가 생각할 수있는 선택 사항은 다음과 같습니다.

  1. 병렬 데이터 리더가 있어야합니다. 각 리더는 데이터의 일부를 쿼리합니다. 이 접근법으로 전체 연결을 어떻게 관리합니까? 또한 내가이 길로 갔다면 사용자의 정상적인 사용을 방해하지 않아야합니다. 이 접근법에서 볼 수있는 또 다른 문제점은 내 스레드를 관리하고 상한값을 설정하는 것입니다. 반면 Parallel.ForEach는 훨씬 간단합니다.

  2. 생산자 - 소비자 패턴 : 하나의 스레드가 데이터를 읽고이를 메모리에 대기시킵니다. 여러 작성자가 메모리의 데이터를 소비하고 텍스트 파일에 기록합니다.

저는 PetaPoco/NPoco에 대해 열려 있습니다. 이상적으로 나는 스레딩 코드를 너무 복잡하게하지 않고 Parallel.ForEach를 사용하려고합니다.

+1

이것은 BCP (https://msdn.microsoft.com/en-us/library/ms162802(v=sql.130).aspx)의 작업처럼 들립니다. 매일 로그를 내보내는 SQL 에이전트 작업을 가질 수 있습니다. BCP는 데이터를 내보내는 데 매우 효율적이며 쿼리를 사용하여 내보낼 데이터를 선택할 수 있습니다. 또한 테이블 분할을 믹스에 추가하는 것도 고려할 수 있습니다. 파티션으로 할 수있는 일의 [한 예] (https://www.mssqltips.com/sqlservertip/2780/archiving-sql-server-data-using-partitioning/)가 있습니다. – PHeiberg

답변

0

병렬 처리는 많은 컴퓨팅이 관련되어있을 때 도움이됩니다. 그러나 여기에는 주로 I/O가 관련되어 있습니다. 하드 디스크는 한 번에 하나의 파일에만 쓸 수 있습니다. 따라서 멀티 스레딩은 원하는 속도로 성장하지 못합니다. 하드 디스크가 다른 파일에 기록 할 때 하드 디스크가 뒤로 이동하고 네 번째로 이동해야하기 때문에 속도가 느려질 수 있습니다.