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

판매상품 110만 행 이관 단계만 47초, 직접 경로에 인덱스도 없는데 느리다

기초INSERT유통479 / 700

상황 ​

본사 레거시 유통 차세대 이관 리허설이다. 판매상품(CF11) 1,096,708행을 새 판매상품 테이블 SLE_ITM_N으로 옮기면서 판매상품 번호 SLE_ITM_ID를 시퀀스로 매긴다. 다른 여섯 단계는 1 ~ 3초인데 이 단계만 47.6초다. 이관 담당: "직접 경로로 넣고 인덱스도 없는데 왜 느리죠?" 시퀀스는 이관 스크립트가 바로 앞에서 기본값으로 만든다.

테이블과 인덱스 ​

  • CF11 판매상품: 1,096,708행 · 8,204블록
  • SLE_ITM_N 새 판매상품 테이블: 비어 있다. 인덱스, 제약, 트리거는 없다(PK는 적재 뒤에 만든다).
  • 시퀀스 SQ_SLE_ITM: 이관 뒤에는 새 판매 화면이 한 건씩 번호를 받는다. 번호는 대리키라 빈 번호가 있어도 된다(업무 확인).
  • 이관 리허설 DB는 단일 인스턴스, NOARCHIVELOG다.

원본 SQL ​

sql
-- 이관 단계 ⑤ 판매상품
CREATE SEQUENCE SQ_SLE_ITM START WITH 1 INCREMENT BY 1;

INSERT /*+ APPEND */ INTO SLE_ITM_N (SLE_ITM_ID, SLE_NO, ITM_NO, SLE_QTY, SLE_UPRC)
SELECT SQ_SLE_ITM.NEXTVAL, SLE_NO, ITM_NO, SLE_QTY, SLE_UPRC
  FROM CF11;
COMMIT;

실행계획 학습용 예시 ​

xplan
-----------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name       | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT                 |            |      1 |        |      0 |00:00:47.61 |    170K |
|   1 |  LOAD AS SELECT                  | SLE_ITM_N  |      1 |        |      0 |00:00:47.61 |    170K |
|   2 |   OPTIMIZER STATISTICS GATHERING |            |      1 |   1096K|   1096K|00:00:46.88 |    164K |
|   3 |    SEQUENCE                      | SQ_SLE_ITM |      1 |        |   1096K|00:00:46.52 |    164K |
|   4 |     TABLE ACCESS FULL            | CF11       |      1 |   1096K|   1096K|00:00:00.21 |    8153 |
-----------------------------------------------------------------------------------------------------------

[세션 통계 — 단계 ⑤ 한 번]
  경과 시간                 47.61 초
  CPU used by this session  31.2 초
  recursive calls          110,214
  session logical reads    170,480
  redo size                 41.2 MB

[TKPROF — 재귀 SQL]
update seq$ set increment$=:2,minvalue=:3,maxvalue=:4,cycle#=:5,order$=:6,cache=:7,highwater=:8,audit$=:9,flags=:10 where obj#=:1
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Execute  54836      9.84      21.40          0          0     109672       54836

[DBA_SEQUENCES] SQ_SLE_ITM · CACHE_SIZE 20 · ORDER_FLAG N · LAST_NUMBER 1096721

문제 ​

  1. 직접 경로로 넣었는데도 47.6초와 redo 41.2MB가 나온 이유를 실행계획 3번 줄과 TKPROF로 설명하시오.
  2. 이관 단계를 고치시오. 고친 방법의 대가도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자