대용량 데이터 빠르게 insert(MSSQL, ORALCE 포함)
클라이언트에서 DB로 몇십만건의 데이타를 삽입할때면 INSERT 보다 빠른 방법이 없을까 고민을 하다 보니 답이 나오네요.
http://archive.msdn.microsoft.com/LinqEntityDataReader
해보시면 그냥 INSERT 보다 몇배는 빠르고 쉽습니다.
static int SendOrders(int totalToSend)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlTransaction tran = con.BeginTransaction())
{
var newOrders =
from i in Enumerable.Range(0, totalToSend)
//삽입 될 테이블 형과 데이터가 같아야함.
select new Order
{
customer_name = "Customer " + i % 100,
quantity = i % 9,
order_id = i,
order_entry_date = DateTime.Now
};
SqlBulkCopy bc = new SqlBulkCopy(con,
SqlBulkCopyOptions.CheckConstraints |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.KeepNulls, tran);
bc.BatchSize = 1000;
bc.DestinationTableName = "order_queue";
bc.WriteToServer(newOrders.AsDataReader());
tran.Commit();
}
con.Close();
}
return totalToSend;
}
AsDataReader가 위 주소에 받을 수 있는 확장 함수입니다.
===> bulkinsert 메소드가 따로 있었군요-_- LINQ 를 안쓰다보니 첨보는군요.
MS-SQL 벌크 인스트 쿼리로 했는데 혹시 모르시는 분들은 MS-SQL 에 BULK INSERT 찾아보시길..BULK INSERT 테이블명 FROM '파일명.csv'
WITH(FIELDTERMINATOR=','
, TABLOCK
, ROWS_PER_BATCH = 100000
)
GO
형태로 CSV 데이타도 일괄 입력 가능 -_-
===> 원격지 클라이언트 프로그램에서 발생한 대량의 데이타를 조금 빨리 넣고자 bulk copy하는 겁니다.
DB콘솔로 BULK INSERT하는거랑은 상황이 조금 틀리죠.^^SqlBulkCopy가 BULK INSERT하는 것인지 몰랏는데 ADO.NET으로 BULK INSERT가 가능하다는겁니다.~~
오라클 쪽에도 이와 비슷한 인터페이스를 제공 하는 ODP .NET 이라고 있습니다.
위와 비슷 하게 함수 명도 똑같고 쓰는 방법도 비슷 하죠 하지만 11g 클라이언트 이상에서만
가능 하다는 제약 조건이 있습니다. ㅠㅠ
그래서 11g 이하 버전에서는 Array Binding 이라는 방법으로 대용량 데이터를 INSERT 합니다.
정용훈 // DB 콘솔로만 벌크 인서트하는건 아니잖아요. 어짜피 디비 연결되는 상황이면 뭐-_-
하긴 서식 파일 만드는거보단 공수가 덜하겠네요.
암튼 메소드 제공되는거 봤으니 활용해야겠네요.