본문 바로가기
IT/MSSQL

[MSSQL] 대규모 테이블 insert시 락 방지를 위해 분할하여 넣는 방법

by 베베야 2023. 8. 13.
728x90

대량의 데이터를 한번에 INSERT 하게 되면 LOCK 이 발생하게 됩니다.

이를 방지하는 방법은 10000개의 데이터를 한번에 INSERT 하지 않고 1000개씩 나눠서 INSERT 하는 방법입니다.

이제 아래에서 대규모 일괄 처리 작업을 여러 개의 작은 작업으로 분할하는 방법에 대해서 알아보겠습니다.


 

 

1.테이블 생성

2개의 테이블일 생성해 줍니다.

create table number_test1 
(
	num1 int
)

create table number_test2 
(
	num1 int
)

 

2.데이터 삽입(number_test1)

number_test1 테이블에 1~10000개의 숫자를 INSERT 합니다.

SET NOCOUNT ON;
DECLARE @i INT = 1 

WHILE @i <= 10000
BEGIN
	INSERT INTO number_test1 values (@i) SET @i += 1
END

select count(*) From number_test1

 

3.데이터 업데이트(number_test1 -> number_test2)

number_test1 테이블에는 현재 10,000개의 데이터가 있습니다. 이 데이터를 1,000개씩 나눠서

number_test2에 INSERT 하는 방법입니다.

 

DECLARE@insert INT, 
@counter INT,
@batch INT


--DECLARE @temp TABLE(productid INT) 
SET @counter = 1
SET @insert = (SELECT count(num1) FROM number_test1) 
SET @batch = @insert/1000 WHILE(@counter <= @batch) 

begin IF(@insert >1000)
	begin
		INSERT INTO number_test2 SELECT num1 FROM number_test1 ORDER BY num1 offset (@counter - 1) * 1000 rows 
		FETCH next 1000 rows only 
	end
	SET @counter = @counter + 1 end

SELECT count(1)AS row_count FROM number_test2

<참고사이트>

https://www.quora.com/How-can-I-insert-1000-rows-in-SQL-at-a-time

반응형
그리드형

댓글