Skip to content
튜닝 연습서브쿼리와 쿼리 변환
SUBQ-022

어젯밤부터 정산 배치의 취소분 정리 단계가 열 배 넘게 느려졌다

중급DELETE한빛유통257 / 700

상황 ​

야간 정산 배치는 T_ORD의 주문을 T_ORD_STLM으로 옮긴 뒤(적재 단계), 취소 주문의 정산 행을 지운다(정리 단계). 정리 단계는 늘 0.1초 안팎이었는데 어젯밤부터 1.9초가 걸렸다. 배치 담당 오과장: "SQL은 한 글자도 안 바꿨다. 바뀐 것은 어제 저녁 DBA가 통계 수집 작업을 22시로 옮긴 것뿐이다." 22시에 T_ORD_STLM은 저녁 테스트 배치가 TRUNCATE만 하고 끝난 빈 테이블이었다. 적재 단계는 23시에 테이블을 다시 채운다.

테이블과 인덱스 ​

  • T_ORD_STLM 정산: 실제 100,000행 · 640블록 · 인덱스 없음 · 통계는 0행(22시 수집) · T_ORD를 ORD_SEQ 순으로 읽어 적재한다
  • T_ORD 주문: 100,000행 · 896블록 · PK_T_ORD (ORD_SEQ) (높이 2) · 취소(ORD_ST = 'CANCEL') 2,000건 · 통계 최신
  • 정리 단계가 지우는 행은 2,000행이다

원본 SQL ​

sql
DELETE FROM T_ORD_STLM s
 WHERE EXISTS (SELECT 1
                 FROM T_ORD o
                WHERE o.ORD_SEQ = s.ORD_SEQ
                  AND o.ORD_ST  = 'CANCEL')

실행계획 학습용 예시 ​

xplan
-----------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name       | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT              |            |      1 |        |      0 |00:00:01.91 |  307912 |
|   1 |  DELETE                       | T_ORD_STLM |      1 |        |      0 |00:00:01.91 |  307912 |
|   2 |   NESTED LOOPS SEMI           |            |      1 |      1 |   2000 |00:00:01.74 |  300640 |
|   3 |    TABLE ACCESS FULL          | T_ORD_STLM |      1 |      1 |    100K|00:00:00.03 |     640 |
|*  4 |    TABLE ACCESS BY INDEX ROWID| T_ORD      |    100K|      1 |   2000 |00:00:01.52 |  300000 |
|*  5 |     INDEX UNIQUE SCAN         | PK_T_ORD   |    100K|      1 |    100K|00:00:00.61 |  200000 |
-----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   4 - filter("O"."ORD_ST"='CANCEL')
   5 - access("O"."ORD_SEQ"="S"."ORD_SEQ")

문제 ​

  1. 30만 블록이 어디서 나오는지 실행계획의 Starts로 설명하시오. 옵티마이저가 이 세미 조인 방식을 고른 이유를 E-Rows로 설명하시오.
  2. 오늘 밤 배치를 위해 SQL을 고치고, 재발을 막는 방법을 함께 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자