대용량 데이터 insert 질문 0 4 2,563

by 힘내라김대리 [SQLServer] mssql sql server 대용량 insert [2023.02.02 15:43:41]



안녕하세요. 질문이 있어 글을 올립니다.

 

지금 프로시져를 이용해서 주문내역에 대한 가짜 데이터를 만들어서 테이블에 Insert 하려고 합니다. (약 4000만건 - 주문번호 기준)

 

프로시져에는 주문번호 1개 단위로 1~30개의 물품을 랜덤으로 뽑아서 만들고, 그걸 임시테이블에 적재 후에 거래내역 테이블에 넣고 있습니다.

(자세한 쿼리는 파일을 첨부해서 올립니다.)

 

지금 Azure SQL에서 성능을 높여서 사용 중이긴 한데, 약 11,000 건에 30분정도 소요됩니다.

 

어떻게 수정을 하면 Insert 하는 속도를 높힐 수 있을까요??

by 마농 [2023.02.02 18:10:17]

1. 루프 안에서 템프테이블 생성하고 템프에 입력하고 템프를 이용해 실테이블에 입력하는데.
- 템프테이블은 루프 밖에서 생성하고 루프 안에서는 템프테이블에만 작업하고
- 최종 한번만 실테이블에 입력하도록 개선 가능
2. 동일한 코드를 3가지 PROC 으로 나누어 실행하는데?
- PROC 내용이 변수값만 빼면 다 똑같은 거 아닌가요?
- PROC 을 나누지 말고 변수값만 달리하면 하나의 PROC 으로 가능해 보입니다.


by 힘내라김대리 [2023.02.03 13:39:26]

우선 알려주신대로 했었는데, 완료하는 시간이 크게 차이가 없는것 같습니다.

그래서 고민한 결과, 기존에 약 3500만건의 데이터가 있는데, 이걸 복사해서 주문번호만 바꿔야 할 것 같아요 (복사 할 때 order_id는 빈칸)

구조는 아래와 같이 간단하게 되어있습니다.

 

order_id product_id qty
10000001 332 2
10000001 53 5
10000001 323 1
10000002 235 2
10000003 3321 2
10000003 1234 2
...... ..... ....

 

이런 구조로 되어있는 테이블 전체를 복사를 해서, order_id만 새로 넣으려고 합니다.

여기서 하고싶은건, 단순히 order_id의 max값 + 1 씩 해서 업데이트 하려고 하는게 아니라, 랜덤으로 N개 추출해서 order_id을 부여하려고 합니다.

어떻게 방법이 있을까요?

 


by 마농 [2023.02.06 09:04:33]

MAX + 1 이 아니라면? 기존 ID 를 사용하겠다는 의미인가요?
왜 그래야 하죠?
주문 상품을 서로 섞어서 추가하겠다는 건가요?


by 신이만든지기 [2023.02.06 09:39:52]
SET @MAX_ORDER_ID = (select  max(cast(order_id as int)) FROM CI_products_per_order)		--주문내역의 주문번호 Max

SELECT TOP 1 T01.product_id FROM CI_products T01 ORDER BY NEWID()

SELECT     order_id
                    ,product_id
                    ,add_to_cart_order
                    ,reordered
            FROM    @TEMP

위 구문에서 full scan 이 발생하는 지 살펴보세요. 

성능을 떨어뜨리는 쿼리가 있을 것으로 보이네요.

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