[SQL] 목록에서 SqlBulkCopy의 <>
SQL목록에서 SqlBulkCopy의 <>
어떻게 간단한 객체의 목록 <>에서 SqlBulkCopy의와 큰 삽입을 할 수 있습니까?
나는 내 사용자 지정 IDataReader에 구현합니까?
해결법
-
==============================
1.간단히 객체의 목록에서 DataTable을을 생성하고 데이터 테이블을 전달 SqlBulkCopy.WriteToServer를 호출합니다.
간단히 객체의 목록에서 DataTable을을 생성하고 데이터 테이블을 전달 SqlBulkCopy.WriteToServer를 호출합니다.
다음과 같은 도움을 찾을 수 있습니다 :
SqlBulkCopy의와 최대 성능을 위해, 당신은 적절한 BatchSize에서 설정해야합니다. 10,000 잘 작동하는 것 같다 -하지만 프로파일 데이터에 대한.
SqlBulkCopyOptions.TableLock를 사용할 때 당신은 또한 더 나은 결과를 관찰 할 수 있습니다.
SqlBulkCopy의 성능의 재미 있고 유익한 분석은 여기에서 찾을 수 있습니다.
-
==============================
2.FastMember, 당신은 이제까지 DataTable을 (성능을 더보다가-두 배로 내 테스트에서하는)를 통해 갈 필요없이이 작업을 수행 할 수 있습니다
FastMember, 당신은 이제까지 DataTable을 (성능을 더보다가-두 배로 내 테스트에서하는)를 통해 갈 필요없이이 작업을 수행 할 수 있습니다
using(var bcp = new SqlBulkCopy(connection)) using(var reader = ObjectReader.Create(data, "Id", "Name", "Description")) { bcp.DestinationTableName = "SomeTable"; bcp.WriteToServer(reader); }
참고 ObjectReader 제네릭이 아닌 소스와 작업도 할 수 있고, (당신은 아마 당신이 ObjectReader 자체를 지정하지 않은 경우에는 SqlBulkCopy의 ColumnMappings 측면을 사용하려는 있지만)는 사전에 회원-이름을 지정할 필요가 없습니다.
-
==============================
3.당신은 Microsoft에서 제공하는이 EntityDataReader 클래스를 추가하는 경우 늦게 파티에,하지만, 정확히 않는 AsDataReader () 확장 방법이있다 : https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs
당신은 Microsoft에서 제공하는이 EntityDataReader 클래스를 추가하는 경우 늦게 파티에,하지만, 정확히 않는 AsDataReader () 확장 방법이있다 : https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs
(실시 예 [목록] .AsDataReader () 구현 :)
var connStr = ""; using (var connection = new SqlConnection(connStr)) { var startTime = DateTime.Now; connection.Open(); var transaction = connection.BeginTransaction(); try { //var connStr = connection.ConnectionString; using (var sbCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction)) { sbCopy.BulkCopyTimeout = 0; sbCopy.BatchSize = 10000; sbCopy.DestinationTableName = "Foobars"; var reader = Foobars.AsDataReader(); sbCopy.WriteToServer(reader); } transaction.Commit(); } catch (Exception ex) { Console.WriteLine(ex.Message); transaction.Rollback(); } finally { transaction.Dispose(); connection.Close(); var endTime = DateTime.Now; Console.WriteLine("Upload time elapsed: {0} seconds", (endTime - startTime).TotalSeconds); } }
-
==============================
4.당신이 처음에 SqlBulkCopy의를 호출하여 수행하려는 작업에 따라, 그것은 테이블 반환 매개 변수 (TVP)를 사용하는 것이 더 적합 할 수 있습니다. TVP를 사용하는 것은 사소한 사용자 정의 형식의 컬렉션에 보낼 수 있도록한다. 데이터는 (많은 @Marc Gravell의 대답처럼) 당신이 DataTable을 피할 수 있도록에서 스트리밍 할 수 있으며뿐만 아니라 SqlBulkCopy의를 피할 수 있습니다. TVP 년대는 저장 프로 시저에 TVP 데이터를 전달하기 위해 전화로는 SQL 서버에 도달하고 당신이 아니라 INSERT합니다 (인으로 아무것도 할 수있는 테이블 변수로 표시하면 데이터를 처리하는 방법을 완전히 유연성을 허용 SqlBulkCopy의를 가진 경우). 또한 데이터는 새로 생성 된 IDENTITY 값 등의 SqlDataReader 개체를 통해 데이터를 백업 할 수 있습니다. 나는 예를 들어,이 대답에 몇 가지 추가 메모를 추가 : 어떻게 가능한 짧은 시간에 1000 만 개 기록을 삽입 할 수 있습니다? 그리고 정의의 일반 목록에 전달하는 작업 예제를 제공 또한 링크 대답에 기록됩니다 SQL Server 중앙에 대한 기사 (무료 등록 필요), 응용 프로그램에서 스트리밍 데이터로 SQL 서버 2008, 쓴 몇 년 전 형, 300 만 행 텍스트 파일에서 스트리밍.
당신이 처음에 SqlBulkCopy의를 호출하여 수행하려는 작업에 따라, 그것은 테이블 반환 매개 변수 (TVP)를 사용하는 것이 더 적합 할 수 있습니다. TVP를 사용하는 것은 사소한 사용자 정의 형식의 컬렉션에 보낼 수 있도록한다. 데이터는 (많은 @Marc Gravell의 대답처럼) 당신이 DataTable을 피할 수 있도록에서 스트리밍 할 수 있으며뿐만 아니라 SqlBulkCopy의를 피할 수 있습니다. TVP 년대는 저장 프로 시저에 TVP 데이터를 전달하기 위해 전화로는 SQL 서버에 도달하고 당신이 아니라 INSERT합니다 (인으로 아무것도 할 수있는 테이블 변수로 표시하면 데이터를 처리하는 방법을 완전히 유연성을 허용 SqlBulkCopy의를 가진 경우). 또한 데이터는 새로 생성 된 IDENTITY 값 등의 SqlDataReader 개체를 통해 데이터를 백업 할 수 있습니다. 나는 예를 들어,이 대답에 몇 가지 추가 메모를 추가 : 어떻게 가능한 짧은 시간에 1000 만 개 기록을 삽입 할 수 있습니다? 그리고 정의의 일반 목록에 전달하는 작업 예제를 제공 또한 링크 대답에 기록됩니다 SQL Server 중앙에 대한 기사 (무료 등록 필요), 응용 프로그램에서 스트리밍 데이터로 SQL 서버 2008, 쓴 몇 년 전 형, 300 만 행 텍스트 파일에서 스트리밍.
from https://stackoverflow.com/questions/3913371/sqlbulkcopy-from-a-list by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 15 분 간격으로 그룹 MySQL의 쿼리 (0) | 2020.04.13 |
---|---|
[SQL] PostgreSQL을 위해하지 않음있는 경우 DATABASE를 생성 시뮬레이션? (0) | 2020.04.13 |
[SQL] 안드로이드 여러 데이터베이스가 열립니다 (0) | 2020.04.13 |
[SQL] SQL 데이터베이스 테이블에서 다형성? (0) | 2020.04.13 |
[SQL] 어떻게 SQL Server의 가입과 UPDATE 문을 할 수 있습니까? (0) | 2020.04.13 |