inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

실습 데이터 생성

강의 DB데이터 질문

2

안태승

작성한 질문수 4

0

--order 프로시저

DELIMITER $$

CREATE PROCEDURE sp_generate_orders(IN p_count INT)

BEGIN

DECLARE v_i INT DEFAULT 0;

DECLARE v_batch_size INT DEFAULT 2000;

DECLARE v_member_id BIGINT;

DECLARE v_item_count INT;

DECLARE v_product_id BIGINT;

DECLARE v_unit_price INT;

DECLARE v_total INT;

DECLARE v_order_id BIGINT;

DECLARE v_j INT;

DECLARE v_status VARCHAR(20);

DECLARE v_rand DOUBLE;

DECLARE v_days_ago INT;

DECLARE v_max_member BIGINT;

DECLARE v_max_product BIGINT;

DECLARE v_base_date DATETIME DEFAULT '2026-04-01 00:00:00';

SELECT MAX(member_id) INTO v_max_member FROM member;

SELECT MAX(product_id) INTO v_max_product FROM product;

SET autocommit = 0;

WHILE v_i < p_count DO

SET v_rand = RAND();

IF v_rand < 0.12 THEN

SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.02))

+ FLOOR(v_max_member * 0.98) + 1;

ELSEIF v_rand < 0.35 THEN

SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.08))

+ FLOOR(v_max_member * 0.90) + 1;

ELSEIF v_rand < 0.59 THEN

SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.20))

+ FLOOR(v_max_member * 0.70) + 1;

ELSE

SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.70)) + 1;

END IF;

SET v_rand = RAND();

IF v_rand < 0.50 THEN

SET v_days_ago = FLOOR(RAND() * 180);

ELSE

SET v_days_ago = 180 + FLOOR(RAND() * 915);

END IF;

SET v_rand = RAND();

SET v_status = CASE

WHEN v_rand < 0.60 THEN 'DELIVERED'

WHEN v_rand < 0.70 THEN 'SHIPPED'

WHEN v_rand < 0.80 THEN 'PAID'

WHEN v_rand < 0.90 THEN 'ORDERED'

ELSE 'CANCELLED'

END;

INSERT

INSERT INTO orders (member_id, order_status, total_price, ordered_at)

VALUES (v_member_id, v_status, 0,

DATE_SUB(v_base_date, INTERVAL v_days_ago DAY)

+ INTERVAL FLOOR(RAND() * 86400) SECOND);

SET v_order_id = LAST_INSERT_ID();

SET v_item_count = 1 + FLOOR(RAND() RAND() 5)

SET v_total = 0;

SET v_j = 0;

WHILE v_j < v_item_count DO

SET v_rand = RAND();

IF v_rand < 0.30 THEN

SET v_product_id = FLOOR(RAND() (v_max_product 0.01)) + 1;

ELSE

SET v_product_id = FLOOR(RAND() * v_max_product) + 1;

END IF;

SET v_unit_price = GREATEST(1000, ROUND(EXP(RAND() 3.0 + 8.0) / 100) 100);

INSERT INTO order_item (order_id, product_id, quantity, unit_price)

VALUES (v_order_id, v_product_id, 1 + FLOOR(RAND() * 3), v_unit_price);

SET v_total = v_total + v_unit_price;

SET v_j = v_j + 1;

END WHILE;

UPDATE orders SET total_price = v_total WHERE order_id = v_order_id;

SET v_i = v_i + 1;

IF v_i % v_batch_size = 0 THEN

COMMIT;

END IF;

END WHILE;

COMMIT;

SET autocommit = 1;

END$$

DELIMITER ;



--리뷰 프로시저

DELIMITER $$

CREATE PROCEDURE sp_generate_reviews(IN p_count INT)

BEGIN

DECLARE v_i INT DEFAULT 0;

DECLARE v_batch_size INT DEFAULT 5000;

DECLARE v_product_id BIGINT;

DECLARE v_member_id BIGINT;

DECLARE v_rating TINYINT;

DECLARE v_rand DOUBLE;

DECLARE v_max_member BIGINT;

DECLARE v_max_product BIGINT;

DECLARE v_base_date DATETIME DEFAULT '2026-04-01 00:00:00';

SELECT MAX(member_id)

INTO v_max_member

FROM member;

SELECT MAX(product_id)

INTO v_max_product

FROM product;

SET autocommit = 0;

WHILE v_i < p_count DO

SET v_rand = RAND();

IF v_rand < 0.40 THEN

SET v_product_id =

FLOOR(RAND() (v_max_product 0.05)) + 1;

ELSE

SET v_product_id =

FLOOR(RAND() * v_max_product) + 1;

END IF;

SET v_member_id =

FLOOR(RAND() * v_max_member) + 1;

SET v_rand = RAND();

SET v_rating = CASE

WHEN v_rand < 0.30 THEN 5

WHEN v_rand < 0.60 THEN 4

WHEN v_rand < 0.75 THEN 3

WHEN v_rand < 0.90 THEN 2

ELSE 1

END;

INSERT INTO review (

product_id,

member_id,

rating,

content,

created_at

)

VALUES (

v_product_id,

v_member_id,

v_rating,

CASE

WHEN RAND() < 0.5

THEN CONCAT('리뷰 내용 ', v_i)

ELSE NULL

END,

DATE_SUB(

v_base_date,

INTERVAL FLOOR(RAND() * 1095) DAY

)

);

SET v_i = v_i + 1;

IF v_i % v_batch_size = 0 THEN

COMMIT;

END IF;

END WHILE;

COMMIT;

SET autocommit = 1;

END$$

DELIMITER ;

image.png

위 상태에서 멈춰있어요

지금 order관련된 프로시저랑 review 관련된 프로시저가 너무 오래걸려서 안되는데 확인 부탁드립니다.

sql mysql dbms/rdbms sql-tuning SQLD

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 안태승님.

프로시저 내부에서 대량 데이터를 반복적으로 INSERT하고, 주문마다 order_item을 추가한 뒤 UPDATE하는 방식은 처리 시간이 오래 걸릴 수 있습니다. 특히 행 단위 반복 처리에서는 배치 크기와 커밋 주기, 인덱스 및 외래 키 제약 조건의 영향을 함께 확인해야 합니다.

대량 데이터 입력 시 배치 처리와 관련된 기존 답변을 참고해 주세요.

해당 답변에서는 대량 입력 시 한 건씩 처리하는 방식과 배치 처리의 차이, 커밋 단위 조정 등에 대해 안내하고 있습니다. 다만 현재 프로시저에는 INSERT가 중복된 부분, 일부 연산식이 깨진 부분, SET 문 뒤 세미콜론 누락 등도 보이므로 실제 실행 오류인지 단순히 처리 시간이 오래 걸리는 것인지 구분하려면 정확한 에러 메시지와 실행 시간, 테이블 인덱스 정보를 함께 확인해야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

극단적으로 from-to가 12일 이고, valid_to가 13일이면?

0

23

1

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

25

2

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

24

2

선생님 샤딩에 대한 강의도 좀 해주세요

0

37

1

몽고DB CAP 이론 관련

0

47

2

아니 이거 갑자기 데이터베이스가 사라졌어요

0

45

1

기타 영역 중 언두로그

0

44

1

ReviewPolicyValidator와 ReviewManger내의 if문

1

46

2

코드 깃허브는 없을까요?

1

45

2

최종 과제 제출합니다.

0

61

2

실전튜닝 4 질문 - group by 순서와 index 순서

0

53

1

@Modifying에 관하여

1

51

1

3-13 과제

0

69

3

DB 쿼리 최적화 시 DB 처리와 애플리케이션 처리의 기준이 궁금합니다

0

55

1

실무에서의 인덱스 관리 방법이 궁금합니다

0

65

1

복합인덱스 설계 질문

0

113

1

이진 트리 노드

0

70

1

통계정보 갱신 질문

0

105

2

PK 관련하여 궁금한 점이 있어서 질문 드립니다.

0

111

2

탐색을 한번 더 하지 않게 하는 방식 중 어댑티브 해시 방식도 맞는지 궁금 합니다.

0

103

2

컬럼 크기가 대용량인 경우 DB 버퍼 풀에 전부 올라오는지 궁금합니다

0

105

2

실습데이터 ORDERS 생성 시간 질문요...

0

137

3

MySQL 서버구조 쿼리파서 질문 있습니다 !

0

97

1

Postgresql 아키텍처 업데이트

1

114

2