2017-11-09 1 views
0

많은 양의 레코드를 내 응용 프로그램에로드하고 (1 백만 +) 처리량을 늘립니다. 처리는 모두 메모리에 있어야합니다.DataTable을 사용하는 것보다 SqlBulkCopy를 더 빨리 사용할 수 있습니까?

나중에 모든 (지금 수정 된) 레코드를 빈 테이블에 덤프하려고합니다.

레코드를로드하는 데 몇 초 밖에 걸리지 않으며 큰 배열의 MyRecord으로 끝납니다.

SqlBulkCopy을 사용하여 절약하는 데는 불과 몇 초 밖에 걸리지 않습니다. 그리고 DataTable에 내 기록을로드하는 느린 - - 약 분당 7500 개 기록

dataTable.Rows.Add(myRecord.Name, myRecord.Age, ....) 

이 중간 단계를 수행하는 빠른 방법이 있나요를 사용

그러나 SqlBulkCopyDataTable (나는 믿는다)가 필요합니다?

+0

당신이 본 적이 https://stackoverflow.com/questions/13722014/insert-2-million-rows-into-sql-server-신속하게 (1 백만 행/초라고 주장하는 사람)? DataTable에 인덱스, 키, 표현식 열, 제약 조건, 다른 테이블과의 관계 등이 있습니까? 아니면 간단 할 수도 있습니다. –

+0

내 데이터 테이블은 완전히 단순하며, 문자열, int 및 datetime 필드는 아무 것도 추가하지 않습니다. – NibblyPig

+0

그의 예제는 새로운 행을 만들고 데이터를 추가하는 것입니다. 나는 당신이 그것을 할 필요가 없을 때 왜 그가 성찰을 사용하는지 확신하지 못한다. – NibblyPig

답변

4

지연은 모든 데이터를 서버로 보내기 전에 DataTable에 버퍼링해야하기 때문에 발생합니다. 더 나은 성능을 얻으려면 레코드를 SqlBulkCopy immediatelly로 보내야하며 클래스가 자체 버퍼링 및 일괄 처리를 사용하도록해야합니다.

SqlBulkCopy는 IDataReader와 함께 사용할 수 있습니다. 모든 ADO.NET 데이터 판독기는이 인터페이스를 구현하므로 모든 데이터 판독기에서 읽은 데이터를 SqlBulkCopy로 푸시 할 수 있습니다.

다른 경우에 개체의 IEnumerable이 있다고 가정하면 FastMember 패키지의 Marc Gravel의 ObjectReader를 사용하여 IEnumerable 위에 IDataReader를 만들 수 있습니다. 이 데이터 판독기가 한 번에 하지 부하 모든 않기 때문에 SqlBulkCopy의 때까지 캐시 된 데이터가 요청하지 :

복사 마크 자갈의 예 :

IEnumerable<SomeType> data = ... 

using(var bcp = new SqlBulkCopy(connection)) 
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description")) 
{ 
    bcp.DestinationTableName = "SomeTable"; 
    bcp.WriteToServer(reader); 
} 
+0

이것은 매우 시원합니다. – NibblyPig

0

문제가 무엇인지 알 수 없습니다. 아래의 프로그램은 1 초 이내에 실행됩니다. 나는 느린 속도가 데이터를 읽고 DataTable에 쓰지 않기 때문이라고 생각한다.

 static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("Col A", typeof(int)); 
      dt.Columns.Add("Col B", typeof(string)); 
      dt.Columns.Add("Col C", typeof(int)); 
      dt.Columns.Add("Col D", typeof(string)); 
      dt.Columns.Add("Col E", typeof(int)); 
      dt.Columns.Add("Col F", typeof(string)); 
      dt.Columns.Add("Col G", typeof(int)); 
      dt.Columns.Add("Col H", typeof(string)); 
      dt.Columns.Add("Col I", typeof(int)); 
      dt.Columns.Add("Col J", typeof(string)); 

      DateTime begin = DateTime.Now; 

      for (int i = 0; i < 7500; i++) 
      { 
       dt.Rows.Add(new object[] { 
        i + 10000, "b", i + 20000, "d", i + 30000, "f", i + 40000, "h", i + 50000, "i" 
       }); 
      } 

      DateTime end = DateTime.Now; 

      Console.WriteLine((end - begin).ToString()); 

      Console.ReadLine(); 
     } 
관련 문제