2012-06-17 6 views
1

한 번에 수백만 개의 레코드를 처리 한 다음 플랫 파일이나 SQL Server 데이터베이스에 저장하는 C# .NET 프로그램이 있습니다..NET에서 SQL Server로 수백만 개의 레코드를 효율적으로 스트리밍하는 방법

현재 SQL Server 데이터베이스에 저장하기 위해 프로그램은 모든 레코드를 플랫 파일에 기록한 다음 bcp를 사용하여 SQL Server로 가져옵니다.

SQL로 가져 오기 전에 모든 레코드를 하드 디스크에 쓰지 않아도되는보다 효율적인 방법이 있습니까?

+0

당신이 있으 보았다 [SqlBulkCopy] (http://msdn.microsoft.com/en- us/library/system.data.sqlclient.sqlbulkcopy.aspx) 데이터를 데이터베이스에로드 하시겠습니까? – GarethD

답변

5

System.Data.SqlClient 네임 스페이스의 SqlBulkCopy 클래스를 사용해보십시오. 이처럼 사용할 수 있습니다 다음 WriteToServer 방법은 오버로드와 3 개의 PARAM 데이터 형식을 받아 들일 것입니다

using (var conn = new SqlConnection(connectionString)) 
using (var bulkCopy = new SqlBulkCopy(conn)) 
{ 
    conn.Open(); 
    { 
     bulkCopy.DestinationTableName = "dbo.MyTable"; 
     DataTable dt = BuildMyData(); 
     try 
     { 
      bulkCopy.WriteToServer(dt); 
     } 
     catch (Exception ex){Console.WriteLine(ex.Message);} 
    } 
} 

:

  • DataRow[]
  • DataTable
  • IDataReader
+0

결과를 스트리밍하려는 경우에 대비하여 IDataReader를 전달할 수도 있습니다. – usr

+0

감사! - 이걸 살펴보고 어떻게 작동하는지 알려 드리겠습니다. 그런데 한 번에 하나 또는 몇 개의 데이터 행을 작성하는 것이 합리적으로 효율적입니까? 또는 서버에 쓰기 전에 메모리를 합리적으로 많이 저장할 것을 목표로해야합니까? –

+2

@ JeffMH 일 경우 병목 현상은 데이터베이스와 응용 프로그램 간의 라운드 트립 일 가능성이 높습니다. 따라서 배치 당 가능한 많은 행을 포함하여 가장 빠를 것입니다. 모든 성능 문제와 마찬가지로 몇 가지 벤치 마크를 통해 확신 할 수 있습니다. –

관련 문제