프로그래밍/.NetFramework
대량의 데이터를 한번에 인서트하자 Bulk Insert
쇠주는참이슬
2015. 1. 21. 16:52
대량의 데이터를 MS-SQL에 인서트 시킬때.
Bulk Insert 를 사용해서 인서트를 해보자.
일반 인서트보다 속도가 어마어마하게 빠를테니.
벌크인서트는 DataTable 이나 StreamReader 클래스를 사용해서 쓸수 있는데
본 포스팅에서는 DataTable을 이용해서 인서트를 한다.
우선 샘플 데이블 구조는 아래와 같다. 아주 간단하게 TEXT 컬럼에 데이터를 백만건을 넣어보자.
CREATE TABLE [dbo].[BULK](
[TEXT] [varchar](50) NULL
) ON [PRIMARY]
소스
1: using System;
2: using System.Collections.Generic;
3: using System.Data;
4: using System.Data.SqlClient;
5: using System.Linq;
6: using System.Text;
7: using System.Threading.Tasks;
8: 9: namespace BulkInsert
10: {11: class Program
12: {13: static void Main(string[] args)
14: {15: long start_time;
16: long end_time;
17: 18: start_time = DateTime.Now.Ticks;19: using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=SampleDb;User ID=sa;Password=@@@@"))
20: { 21: sqlconn.Open(); 22: 23: DataTable dt = new DataTable("[BULK]");
24: DataColumn col = new DataColumn();
25: // col.DataType = Type.GetType("string");
26: col.ColumnName = "TEXT";
27: 28: dt.Columns.Add(col); 29: 30: for (int i = 0; i < 1000000; i++)
31: { 32: DataRow dr = dt.NewRow();33: dr["TEXT"] = i + " 번째 값";
34: dt.Rows.Add(dr); 35: } 36: 37: using (SqlBulkCopy s = new SqlBulkCopy(sqlconn))
38: { 39: s.DestinationTableName = dt.TableName;40: s.ColumnMappings.Add("TEXT", "TEXT");
41: s.WriteToServer(dt); 42: } 43: } 44: 45: end_time = DateTime.Now.Ticks; 46: 47: TimeSpan timespan = new TimeSpan(end_time - start_time);
48: Console.WriteLine(timespan.Seconds.ToString()); 49: 50: Console.Read(); 51: } 52: } 53: }WriteToServer 에 DataTable 객체나, StreamReader 객체를 넣어주면 된다.
실제로 아래 백만건의 텍스트를 MS-SQL에 저장하는데 걸린 시간이다. 7초!!!!!!!!!
벌크인서트, 대량인서트, 백만건, Bulk Insert, MS-SQL BULK, 벌크 인서트, BulkInsert, .NET, C#