Skip to content
튜닝 연습인덱스 사용 조건
IDX-010

정보계 재전송 배치가 1,000건을 보낼 때마다 주문 테이블을 다 읽는다

기초SELECT버거10 / 700

상황 ​

버거원 본사 정보계(DW) 적재가 장애로 비어서 주문 100만 건을 처음부터 다시 보내야 한다. 연동 배치는 마지막으로 보낸 주문번호(:v_last)를 기억해 두고, 그다음 1,000건씩 한 번에 받아 보낸다. 1,000번 돌아야 끝나는데 한 번 도는 데 걸리는 시간이 줄지 않는다. 오과장이 한 번 도는 SQL의 실행계획을 떠 왔다.

테이블과 인덱스 ​

  • ORD: 1,000,000행 · 22,422블록(블록당 약 45행) · ORD_NO NUMBER 1 ~ 1,000,000(빈 번호 없음, 주문 일시 순으로 매겼다) · 테이블도 주문번호 순서로 쌓였다
  • 인덱스 ORD_PK (ORD_NO): BLEVEL 2 · 리프 약 2,090블록 · ORD_X01 (ORD_DT, ORD_HMS) · 통계 최신

원본 SQL ​

sql
SELECT ORD_NO, ORD_DT, ORD_HMS, SHOP_NO
  FROM ORD
 WHERE ORD_NO - :v_last BETWEEN 1 AND 1000
 ORDER BY ORD_NO

실행계획 학습용 예시 ​

xplan
----------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |   1000 |00:00:00.21 |   22239 |          |
|   1 |  SORT ORDER BY     |      |      1 |   2500 |   1000 |00:00:00.21 |   22239 |59392  (0)|
|*  2 |   TABLE ACCESS FULL| ORD  |      1 |   2500 |   1000 |00:00:00.20 |   22239 |          |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(("ORD_NO"-:V_LAST>=1 AND "ORD_NO"-:V_LAST<=1000))

문제 ​

  1. ORD_PK가 있는데도 1,000건을 가져올 때마다 테이블 전체를 읽는 이유를 설명하시오. 재전송 전체(1,000번)의 일량도 어림하시오.
  2. 같은 1,000건을 가져오면서 PK 범위만 읽도록 SQL을 고치시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자