SQL Server 2005의 Bulk Insert 성능 비교를 다음과 같이 수행해 보았습니다.
임의로 10,000,000건의 텍스트 데이터를 만든 후, 각각의 방법을 이용하여 MSSQL Server 2005의 테이블에 넣는 방식입니다.
1. Source Text File 생성 스크립트 (VB.net Script : SSIS 내의 스크립트 작업을 이용하여 실행)
Imports System Imports System.Data Imports System.Math Imports System.IO Imports Microsoft.SqlServer.Dts.Runtime Public Class ScriptMain Public Sub Dim str As String Dim StrWriter As StreamWriter Dim i As Integer StrWriter = File.CreateText("D:\test.txt") For i = 1 To 10000000 str = i.ToString + "|" + Convert.ToString(i * 2) + "|" + Convert.ToString(i * 3) + "|" + (Convert.ToInt32(i / 2)).ToString StrWriter.WriteLine(str) Next StrWriter.Close() Dts.TaskResult = Dts.Results.Success End Sub End Class |
2. Text File Sample (d:\text.txt : 10,000,000행, 321 MB)
1|2|3|0 2|4|6|1 3|6|9|2 4|8|12|2 5|10|15|2 6|12|18|3 7|14|21|4 8|16|24|4 9|18|27|4 10|20|30|5 … … … … 9999995|19999990|29999985|4999998 9999996|19999992|29999988|4999998 9999997|19999994|29999991|4999998 9999998|19999996|29999994|4999999 9999999|19999998|29999997|5000000 10000000|20000000|30000000|5000000 |
3. Format File (d:\testImport-f-n.Fmt)
9.0 4 1 SQLBIGINT 0 8 "|" 1 c1 "" 2 SQLBIGINT 0 8 "|" 2 c2 "" 3 SQLBIGINT 0 8 "|" 3 c3 "" 4 SQLBIGINT 0 8 "\r\n" 4 c4 "" |
4. 성능 비교
1) OPENROWSET 이용
- 수행 스크립트
CREATE TABLE testOpenRowset(c1 bigint, c2 bigint, c3 bigint, c4 bigint) GO DBCC DROPCLEANBUFFERS DECLARE @start DATETIME SET @start = getdate() INSERT INTO testOpenRowset(c1, c2, c3, c4) SELECT t1.c1, t1.c2, t1.c3, t1.c4 FROM OPENROWSET( BULK 'd:\test.txt', FORMATFILE = 'd:\testImport-f-n.Fmt') AS t1(c1, c2, c3, c4); SELECT getdate() - @start as ElapsedTime DROP TABLE testOpenRowset GO |
- 테스트 결과 (반복해서 12회 수행 후, 최대치 및 최소치를 제외한 10개의 값으로 평균을 계산)
순번 |
걸린 시간 |
데이터 유효성 |
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
최대치 - 제외 |
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
최소치 - 제외 |
평균 |
|
|
2) BULK INSERT 이용
- 수행 스크립트
CREATE TABLE testBulkInsert(c1 bigint, c2 bigint, c3 bigint, c4 bigint) GO DBCC DROPCLEANBUFFERS DECLARE @start DATETIME SET @start = getdate() BULK INSERT testBulkInsert FROM 'd:\test.txt' WITH (FORMATFILE='d:\testImport-f-n.Fmt') SELECT getdate() - @start as ElapsedTime DROP TABLE testBulkInsert GO |
- 테스트 결과 (반복해서 12회 수행 후, 최대치 및 최소치를 제외한 10개의 값으로 평균을 계산)
순번 |
걸린 시간 |
데이터 유효성 |
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
최대치 - 제외 |
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
최소치 - 제외 |
평균 |
|
|
3) BCP 이용
- 수행 스크립트
CREATE TABLE testBCP(c1 bigint, c2 bigint, c3 bigint, c4 bigint) GO DBCC DROPCLEANBUFFERS DECLARE @start datetime SET @start = getdate() EXEC master..xp_cmdshell 'bcp test.dbo.testBCP in d:\test.txt -T -b1000000 -fd:\testImport-f-n.Fmt' SELECT getdate() - @start as ElapsedTime DROP TABLE testBCP GO |
- 테스트 결과 (반복해서 12회 수행 후, 최대치 및 최소치를 제외한 10개의 값으로 평균을 계산)
순번 |
걸린 시간 |
데이터 유효성 |
1 |
|
최대치 - 제외 |
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
최소치 - 제외 |
12 |
|
|
평균 |
|
|
4) SSIS 이용 - FastParse = off (기본값)
- 수행 패키지
제어 흐름 |
데이터 흐름 |
|
|
- 테스트 결과 (반복해서 12회 수행 후, 최대치 및 최소치를 제외한 10개의 값으로 평균을 계산)
순번 |
걸린 시간 |
데이터 유효성 |
1 |
|
최대치 - 제외 |
2 |
|
|
3 |
|
|
4 |
|
최소치 - 제외 |
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
평균 |
|
|
5) SSIS 이용 - FastParse = on
- 수행 패키지
제어 흐름 |
데이터 흐름 |
|
|
|
- 테스트 결과 (반복해서 12회 수행 후, 최대치 및 최소치를 제외한 10개의 값으로 평균을 계산)
순번 |
걸린 시간 |
데이터 유효성 |
1 |
|
|
2 |
|
|
3 |
|
최소치 - 제외 |
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
최대치 - 제외 |
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
평균 |
|
|
5. 성능 비교 요약
데이터 처리 방식 |
걸린 시간 |
순위 |
OPENROWSET |
|
4 |
BULK INSERT |
|
3 |
BCP |
|
5 |
SSIS ? FastParse=off |
|
2 |
SSIS ? FastParse=on |
|
1 |
SSIS를 이용하는 방식이 BCP, OPENROWSET, BULK INSERT 등에 비해 약 48%정도 빠른 수행 결과를 나타냄.
테스트 수행 참고 사이트 : http://weblogs.sqlteam.com/mladenp/articles/10631.aspx
[출처] SQL Server 2005의 Bulk Insert 성능 비교 |작성자 필립박
'데이터베이스 > SQL Server' 카테고리의 다른 글
table 내의 모든 제약조건, index 이름, 해당에 index가 걸린 column 조회 (0) | 2008.04.28 |
---|---|
MSSQL 에서 XML 데이터 입력, 출력, 수정하는 방법 (0) | 2008.04.28 |
mssql txt or csv 파일 데이터 Insert (0) | 2008.04.28 |
MSSQL CSV Bulk Insert (0) | 2008.04.28 |
MSSQL2005에서 2G이상 메모리 사용하기 (0) | 2008.04.28 |