2016-12-05 6 views
1

구조적 테이블 삽입과 대량 복사간에 성능 차이가 있는지 궁금합니다. 구현을 시작하기 전에 실적이있을 수있는 경험이나 아이디어. 나는 데이터베이스 레이어 호출을 위해 Spring.net을 사용하고있다.SQL 대량 복사 대 구조화 테이블 삽입

는 SQL 대량의 데이터 테이블에 매핑되는 데이터 유형을 작성

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(this.connectionstring) 
{ 
bulkCopy.DestinationTableName = "BulkDataTable"; 
bulkCopy.WriteToServer(dataTable); 
} 

SQL 구조화 형의 삽입 를 삽입하고 대량으로 삽입되는 모든 행과 데이터 테이블을 전달합니다.

DataTable dataTable = this.dataTableRef.Value.Clone(); 
// add rows the the binary data table 
SqlParameter insertParam = new SqlParameter(); 
insertParam.ParameterName = "DataTableInput"; 
insertParam.SqlDbType = SqlDbType.Structured; 
insertParam.TypeName = "dbo.DataTableType"; 
insertParam.Value = dataTable; 
insertParams.AddParameter(insertParam); 
AdoTemplate.ExecuteNonQuery(CommandType.Text, "INSERT INTO <table_name> SELECT * FROM @DataTableInput", insertParams); 

답변

2

대량 삽입하려는 데이터의 양과 SQL Server 인스턴스의 복구 모드가 설정되는 방법에 따라 달라집니다. SqlBulkCopy는 데이터베이스가 단순 복구 또는 일괄 복구 인 경우 특정 상황에서 최소한으로 기록 된 삽입을 제공 할 수 있습니다. 데이터베이스가 전체 복구 인 경우 성능 차이가 거의 없을 수 있습니다.

MSDN에서

또한 비교 : 테이블 값 파라미터를 사용

가 세트 기반 변수를 사용하는 다른 방법에 필적; 그러나 테이블 값 매개 변수를 자주 사용하면 큰 데이터 세트의 경우 더 빠를 수 있습니다. 이 테이블 반환 매개 변수보다 큰 시작 비용을 갖는 대량 작업과 비교할 때 테이블 값이 인 매개 변수는 1000 개 미만의 행을 삽입하는 데 적합합니다.

임시 테이블 캐싱을 사용하면 재사용되는 테이블 반환 매개 변수가 유용합니다. 이 테이블 캐싱은 BULK INSERT 조작 동등 이상의 확장 성을 제공합니다. 작은 행 삽입 작업을 사용하면 BULK INSERT 작업이나 테이블 값이 지정된 매개 변수 대신 매개 변수 목록 또는 일괄 처리 문을 사용하여 작은 성능 이점을 얻을 수 있습니다. 그러나 이러한 방법은 프로그래밍하기가 쉽지 않으므로 행이 증가하면 성능이 빨리 떨어집니다.

테이블 값 매개 변수는 동일한 매개 변수 배열 구현과 동등하게 또는 동일하게 수행됩니다.