테마
이 문제는 교재 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로 만들었다.-- 매일 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;
[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) · 커밋
LOG ERRORS를 붙였는데도 중복 3행 때문에 문장 전체가 롤백된 이유를 설명하시오. 10월 12일에는 왜 됐는지도 쓰시오.