2014-12-02 4 views
1

행을 업데이트/삽입하기 위해 텍스트 파일을 읽는 프로그램이 있습니다. 나는 아래의 다음 의사 코드 방법을 시도했다. 이것들은 모두 매우 느립니다. 이 코드는 SQL Server에서 직접 실행되며이 프로세스는 모두 완료하는 데 많은 시간이 걸립니다 ...SQL Server에서 수백만 행을 가장 효율적으로 삽입/업데이트하는 방법은 무엇입니까?

업데이트/삽입 문은 수백만 개 정도의 어딘가에 있습니다. .net C#에서 그 많은 SQL 문을 실행하는 가장 효율적인 방법은 무엇입니까?

// Insert/Update while reading text file 
While (reader.read) 
{ 
    sql.ExecuteNonQuery(); 
} 

또는 ...

// build a list to loop through later and insert/update 
While (reader.read) 
{ 
    List.Add(sql); 
} 

foreach(string s in sql) 
{ 
    sql.ExecuteNonQuery(); 
} 

또는 ...

// Build a list and run 1000 statements at one time 
While (reader.read) 
{ 
    List.Add(sql); 
    if(List.Count == 1000) 
    { 
     sql.ExecuteNonQuery(); 
    } 
} 
+0

그것은 꽤 간단하고 신속하고도 효율적으로 – MethodMan

답변

5

사용 SqlBulkCopy Class.

다른 원본의 데이터로 SQL Server 테이블을 효율적으로 대량로드 할 수 있습니다.

Microsoft SQL Server에는 서버 또는 서버간에 단일 테이블에서 다른 테이블로 데이터를 이동하는 데 사용되는 널리 사용되는 명령 프롬프트 유틸리티 인 bcp가 포함되어 있습니다. SqlBulkCopy 클래스를 사용하면 비슷한 기능을 제공하는 관리 코드 솔루션을 작성할 수 있습니다.

SQL Server 테이블에 데이터를로드 다른 방법 (INSERT 문, 예를 들어 이)가 있지만 SqlBulkCopy의 그들을 통해 상당한 성능 이점을 제공합니다. SqlBulkCopy 클래스를 사용하여 데이터를 SQL Server 테이블에만 쓸 수 있습니다. 그러나 데이터 원본은 SQL Server에 으로 제한되지 않습니다. 데이터가 으로 DataTable 인스턴스에로드되거나 IDataReader 인스턴스로 읽을 수있는 한 모든 데이터 소스를 사용할 수 있습니다. 대량 삽입이 다음 임시 테이블을 생성하고 XML을 통해 모든 대량 삽입을 할 수있는 옵션이없는 경우

+0

이 만에 삽입 또는 업데이트뿐만 아니라? – shaolinmonk

+0

@shaolinmonk, 내가 아는 한 업데이트 용으로 사용할 수 없습니다. 임시 테이블에 데이터를 삽입 한 다음 업데이트해야합니다. 참조 : http://stackoverflow.com/questions/4889123/any-way-to-sqlbulkcopy-insert-or-update-if-exists 및 http://stackoverflow.com/questions/12521692/c-sharp-bulk- insert-sqlbulkcopy-update-if-exists/12535726 # 12535726 – Habib

관련 문제