Skip to content
튜닝 연습인덱스 스캔 효율과 테이블 액세스
ACC-013

1분마다 도는 대기 주문 정리가 해마다 무거워진다

중급UPDATE한빛유통88 / 700

상황 ​

현금 결제 주문은 입금을 기다리는 동안 상품 재고를 잡아 둔다. 30분 안에 입금되지 않으면 1분마다 도는 정리 작업이 그 주문을 취소해 재고를 푼다. 한 번에 바뀌는 주문은 보통 0 ~ 2건이다. 오픈할 때는 몇 블록이면 끝났는데, 2년이 지난 지금은 한 번에 400블록 넘게 읽는다. 오과장은 이렇게 묻는다. "바뀌는 건 한두 건인데 왜 해마다 무거워지나?"

테이블과 인덱스 ​

  • T_ORD: 100,000행 · 896블록 · ORD_DT DATE(시분초 있음, 2023 ~ 2024, 하루 약 137건) · PAY_TP CARD · CASH · POINT가 1/3씩 · ORD_ST COMPLETE · PENDING · CANCEL
  • 운영 상태: 기한이 지난 현금 대기 주문은 이 작업이 그때그때 취소해 왔다. 그래서 기한이 지났는데 PENDING으로 남은 현금 주문은 실행할 때마다 0 ~ 2건뿐이다
  • 인덱스 PK_T_ORD (ORD_SEQ) · IX_T_ORD_DT_ST_TP (ORD_DT, ORD_ST, PAY_TP): 「일자별 상태·결제수단 현황」용 · BLEVEL 1 · 리프 약 417블록(리프 한 블록에 약 240항목) · 통계 최신 · ORD_ST에 히스토그램

원본 SQL ​

sql
UPDATE T_ORD
   SET ORD_ST = 'CANCEL'
 WHERE ORD_ST = 'PENDING'
   AND PAY_TP = 'CASH'
   AND ORD_DT < SYSDATE - 30/1440

실행계획 학습용 예시 · 행 수는 적재 스크립트 그대로 · 운영 상태는 문제에 적은 대로 ​

xplan
[한 번 실행 — 기한이 지난 현금 대기 주문 1건]
-----------------------------------------------------------------------------------------------
| Id  | Operation          | Name              | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |                   |      1 |        |      0 |00:00:00.01 |     425 |
|   1 |  UPDATE            | T_ORD             |      1 |        |      0 |00:00:00.01 |     425 |
|*  2 |   INDEX RANGE SCAN | IX_T_ORD_DT_ST_TP |      1 |      2 |      1 |00:00:00.01 |     418 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ORD_DT"<SYSDATE@!-.0208333333333333333333333333333333333333 AND "ORD_ST"='PENDING' AND
              "PAY_TP"='CASH')
       filter(("ORD_ST"='PENDING' AND "PAY_TP"='CASH'))

문제 ​

  1. 바뀌는 주문은 1건인데 2번 줄이 418블록을 읽는 이유를 access와 filter로 설명하시오. 이 작업이 왜 해마다 무거워지는지도 설명하시오.
  2. 인덱스를 설계해 DDL을 작성하고, 이 작업이 읽는 양이 한 번에, 하루에 어떻게 바뀌는지 숫자로 쓰시오.
  3. 그 인덱스가 UPDATE와 INSERT에 주는 부담을 설명하시오. 조건을 ORD_DT >= SYSDATE - 1처럼 좁혀 쓰는 방법의 문제도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자