mssql 대용량 insert 질문드립니다! 0 3 3,042

by 안찌 [SQL Query] [2019.06.10 11:34:28]


대략 78만건 정도의 데이터를 insert 해야하는데

팀장님께서 100건씩 끊어서 돌리라고하시더라구요!

 

INSERT [dbo].[테이블] (컬럼들) VALUES (값)  <- 이런 insert 문이 78만개가 있습니다..!
 

이게 insert 문을 쭉 늘어놓고 100개씩만 직접 돌리라는건아닌거같은데..

쉬운 방법이 있나요?

 

프로시저로 어떻게 할수있는 방법 찾아보고있는데 수동작업보다 구글링하는게 시간 더 걸릴거같아서 그냥 수동으로 할까 생각중입니다..

by 르매 [2019.06.10 14:51:59]

로컬에 데이터 원본을 csv 파일로 저장해 두고, SSIS 에서 bulk insert task 사용하면 간단히 처리할 수 있습니다.

bulk insert task 를 선택하면 속성 중에 Batch Size 가 있는데 이 값을 100으로 설정하면.. 한 번의 트랜잭션에 100개씩 처리하게 됩니다.


by 안찌 [2019.06.10 15:52:36]

답변 감사합니다!

한번의 트랜잭션에 100개씩 처리한다는 뜻을 잘 이해하지 못하겠습니다..

혹시 설명해주실수 있으신가요?..

 

 

그리고 

 BULK INSERT A테이블 FROM '파일경로' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', BATCHSIZE = 100) 

 

위와 같이 작성후 a테이블에 insert 테스트를 해보려고하는데

대량 로드할 수 없습니다. 파일 "파일경로"이(가) 없거나 파일 액세스 권한이 없습니다.

이렇게 오류가 나네요! 이건 제 db유져에 bulk insert를 할수있는 권한이 없다는 뜻 맞나요??

 

마지막으로

BEGIN TRY
BULK INSERT A테이블 FROM '파일경로' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', BATCHSIZE = 100) 
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

위와 같이 작성할경우 insert가 하나라도 실패할경우 모두 롤백처리 될까요?


by 르매 [2019.06.10 20:58:57]

1. 100개씩이란.. 100개의 레코드를 한 번에 전송 및 적재한다는 뜻입니다. 대상 테이블의 잠금을 최소화하기 위해 이 숫자를 100까지 낮출 수 있죠.

2. BULK INSERT 문을 직접 실행한다면 파일은 서버에 올려져 있어야 합니다. 그리고 파일이 들어있는 폴더에 대한 읽기 권한이 MS-SQL 서비스를 실행하고 있는 계정에 부여되어 있어야 합니다. 사실 SSIS를 권해드렸던 것도.. 이 부분 - 권한 설정 - 이 까다로울 때가 있어서입니다. SSIS는 로컬 PC에서 실행되어 원격 서버에 접속하는 방식이기 때문에, 파일의 위치나 권한 문제로부터 자유롭죠.

3. 네, 전체 롤백됩니다만.. 이러면 의미가 없어요. 애초에 대상 테이블에 대한 잠금을 최소화하기 위한 것인데.. 트랜잭션을 걸어버리면 안되죠.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입