Skip to content
튜닝 연습DML과 배치 튜닝
DML-040

LOG ERRORS를 붙여 둔 제휴 포인트 적재가 중복 3건 때문에 통째로 롤백됐다

중급INSERT이커머스465 / 700

이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.

상황 ​

이커머스 쇼핑몰은 매일 03:00에 제휴사가 보낸 포인트 적립 파일을 stg_point_tx로 받아 point_transactions에 넣는다. 문제가 있는 행은 에러 테이블에 남기고 나머지는 넣도록 LOG ERRORS를 붙여 두었다. 10월 28일 제휴사가 전날 파일의 일부를 한 번 더 보냈고, 적재는 ORA-00001로 실패했다. 들어간 행도, 에러 테이블에 남은 행도 0건이었다. 고객센터: "어제 제휴 적립이 하나도 안 됐다는 문의가 오전에만 40건 들어왔어요." 앱은 낮에도 적립과 사용을 point_transactions에 한 건씩 넣는다.

테이블과 인덱스 ​

  • point_transactions: 45,000행 · 210블록 · PK tx_id(PK_POINT_TRANSACTIONS) · tx_type (EARN · USE · EXPIRE) · 앱이 시간당 약 400건을 넣는다(새벽에도 약 50건).
  • 제휴 적립은 제휴사 거래 번호를 그대로 tx_id로 쓴다.
  • stg_point_tx: 날마다 비우고 받는다. 10월 28일 파일은 1,214행이고, 그중 3행은 point_transactions에 이미 있는 tx_id다(제휴사가 한 번 더 보낸 행). 파일 안에서 겹치는 행은 없다.
  • 에러 테이블 err$_point_transactions는 DBMS_ERRLOG.CREATE_ERROR_LOG로 만들었다.

원본 SQL ​

sql
-- 매일 03:00 · 제휴사 포인트 적립
INSERT /*+ APPEND */ INTO point_transactions (tx_id, customer_id, amount, tx_type, created_at)
SELECT s.tx_id, s.customer_id, s.amount, 'EARN', s.created_at
  FROM stg_point_tx s
   LOG ERRORS INTO err$_point_transactions ('20241028') REJECT LIMIT UNLIMITED;
COMMIT;

실행계획 학습용 예시 ​

xplan
[10/28 03:00 배치 로그]
  ORA-00001: unique constraint (ECOMMERCE.PK_POINT_TRANSACTIONS) violated
  point_transactions 들어간 행 0 · err$_point_transactions ('20241028') 0행 · 문장 전체 롤백

[실행계획]
---------------------------------------------------------------------------------------------------
| Id  | Operation          | Name               | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT   |                    |      1 |        |      0 |00:00:00.04 |      61 |
|   1 |  LOAD AS SELECT    | POINT_TRANSACTIONS |      1 |        |      0 |00:00:00.04 |      61 |
|   2 |   TABLE ACCESS FULL| STG_POINT_TX       |      1 |   1214 |   1214 |00:00:00.01 |       7 |
---------------------------------------------------------------------------------------------------

[10/12 · 비슷한 일이 있던 날 운영 담당이 힌트를 지우고 손으로 다시 돌린 결과]
  1,209행 적재 · err$_point_transactions 5행 (ORA-00001) · 커밋

문제 ​

  1. LOG ERRORS를 붙였는데도 중복 3행 때문에 문장 전체가 롤백된 이유를 설명하시오. 10월 12일에는 왜 됐는지도 쓰시오.
  2. 중복은 에러 테이블에 남기고 나머지는 넣도록 적재를 고치시오. 넣은 건수와 거부된 건수가 파일 건수와 맞는지 배치가 스스로 확인하게 하시오.
  3. 이 테이블에 직접 경로 적재를 쓰지 않는 다른 이유를 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자