안녕하세요. 질문이 있어 글을 올립니다.
지금 프로시져를 이용해서 주문내역에 대한 가짜 데이터를 만들어서 테이블에 Insert 하려고 합니다. (약 4000만건 - 주문번호 기준)
프로시져에는 주문번호 1개 단위로 1~30개의 물품을 랜덤으로 뽑아서 만들고, 그걸 임시테이블에 적재 후에 거래내역 테이블에 넣고 있습니다.
(자세한 쿼리는 파일을 첨부해서 올립니다.)
지금 Azure SQL에서 성능을 높여서 사용 중이긴 한데, 약 11,000 건에 30분정도 소요됩니다.
어떻게 수정을 하면 Insert 하는 속도를 높힐 수 있을까요??
1. 루프 안에서 템프테이블 생성하고 템프에 입력하고 템프를 이용해 실테이블에 입력하는데.
- 템프테이블은 루프 밖에서 생성하고 루프 안에서는 템프테이블에만 작업하고
- 최종 한번만 실테이블에 입력하도록 개선 가능
2. 동일한 코드를 3가지 PROC 으로 나누어 실행하는데?
- PROC 내용이 변수값만 빼면 다 똑같은 거 아닌가요?
- PROC 을 나누지 말고 변수값만 달리하면 하나의 PROC 으로 가능해 보입니다.
우선 알려주신대로 했었는데, 완료하는 시간이 크게 차이가 없는것 같습니다.
그래서 고민한 결과, 기존에 약 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을 부여하려고 합니다.
어떻게 방법이 있을까요?
MAX + 1 이 아니라면? 기존 ID 를 사용하겠다는 의미인가요?
왜 그래야 하죠?
주문 상품을 서로 섞어서 추가하겠다는 건가요?
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 이 발생하는 지 살펴보세요.
성능을 떨어뜨리는 쿼리가 있을 것으로 보이네요.