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

보관을 마친 작년 주문 5만 건을 지우는데 TKPROF에 주문상세 DELETE가 5만 번 찍힌다

기초DELETE한빛유통471 / 700

상황 ​

매년 1월 첫 일요일 보관 배치는 지난해 주문과 주문상세를 보관 테이블로 옮긴 뒤 운영 테이블에서 지운다. 올해 리허설에서 옮기는 단계는 1초 안쪽이었는데 지우는 단계만 8.9초였다. 오과장: "DELETE는 주문 한 문장뿐인데 TKPROF에 주문상세 DELETE가 5만 번 찍혀요." 주문상세 FK는 2017년 「주문 삭제」 화면을 만들 때 ON DELETE CASCADE로 바꿨다. 그 화면은 2020년에 없어졌고, 지금은 취소도 상태(CANCEL)로만 남긴다. 주문을 지우는 것은 이 보관 배치뿐이다.

테이블과 인덱스 ​

  • T_ORD: 100,000행 · 896블록 · PK_T_ORD (ORD_SEQ) · ORD_DT 2023-01-01 ~ 2024-12-31 · 2023년 주문 50,060건
  • T_ORD_DET: 200,000행 · 896블록(전체 스캔 807) · PK_T_ORD_DET (ORD_SEQ, ORD_DET_NO) · 2023년 주문의 상세 100,140행 · FK_T_ORD_DET_ORD (ORD_SEQ) REFERENCES T_ORD ON DELETE CASCADE
  • 보관 테이블 T_ORD_ARC, T_ORD_DET_ARC에 2023년분을 넣고 건수 대조까지 끝냈다. T_ORD를 참조하는 다른 FK는 없다.
  • 연습 DB 복사본(NOARCHIVELOG)이다. 보관 배치가 도는 동안 두 테이블에 쓰는 다른 세션은 없다.

원본 SQL ​

sql
-- 매년 1월 첫 일요일 · 보관 배치 ③ 운영에서 지우기 (보관과 건수 대조가 끝난 뒤)
DELETE FROM T_ORD
 WHERE ORD_DT >= DATE '2023-01-01' AND ORD_DT < DATE '2024-01-01';   -- 상세는 CASCADE 가 지운다
COMMIT;

실행계획 학습용 예시 · 2023년 주문과 상세 건수는 DML-036과 같은 규모 ​

xplan
----------------------------------------------------------------------------------------
| Id  | Operation          | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |       |      1 |        |      0 |00:00:08.91 |    812K |
|   1 |  DELETE            | T_ORD |      1 |        |      0 |00:00:08.91 |    812K |
|*  2 |   TABLE ACCESS FULL| T_ORD |      1 |  50060 |  50060 |00:00:00.02 |     885 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(("ORD_DT">=TO_DATE(' 2023-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
              "ORD_DT"<TO_DATE(' 2024-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss')))

[세션 통계 — ③ 한 번]
  경과 시간                  8.91 초
  CPU used by this session   7.62 초
  recursive calls            50,214
  execute count              50,108
  session logical reads      812,430
  redo size                  96.8 MB
  undo change vector size    41.2 MB

[TKPROF — 재귀 SQL (dep=1)]
delete from "SQLP"."T_ORD_DET" where "ORD_SEQ" = :1
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Execute  50060      4.12       4.48          0     150188     411562      100140

문제 ​

  1. 주문 DELETE 한 문장에서 주문상세 DELETE가 5만 번 실행된 이유를 설명하시오.
  2. 같은 결과를 내도록 지우는 단계를 고치시오. FK는 어떻게 할지와 그 근거를 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자