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

주문상품 인덱스 넷 가운데 「영수증 재출력용」 하나를 지워도 되는지 묻는다

기초DDL버거69 / 700

상황 ​

버거원 POS의 「영수증 재출력」은 주문번호로 주문상품을 읽는다. 2년 전 개발자는 이 화면을 위해 ORD_ITEM_X03 (ORD_NO)를 만들며 이렇게 적었다. "PK가 (ORD_NO, ITEM_ID) 두 컬럼이라 주문번호 하나만으로는 PK를 못 탈 것 같다." 이번 점검에서 주문상품 적재가 무겁다는 말이 나왔고, 오과장은 X03을 지워도 되는지 물었다.

테이블과 인덱스 ​

  • ORD_ITEM 주문상품: 2,472,717행 · 55,265블록 · (ORD_NO, ITEM_ID) 순으로 쌓였다 · 주문 하나에 평균 2.5줄 · POS가 하루 약 3,400줄을 INSERT한다
  • ORD_ITEM_PK (ORD_NO, ITEM_ID): BLEVEL 2 · 리프 약 6,200블록 · CF 약 55,100
  • ORD_ITEM_X01 (ORD_DT, ORD_HMS): 리프 약 9,320블록 · ORD_ITEM_X02 (ITEM_ID, ORD_DT, ORD_ITEM_QTY): 「상품 월간 추이」용
  • ORD_ITEM_X03 (ORD_NO): BLEVEL 2 · 리프 약 5,400블록 · CF 약 55,100 · 통계 최신
  • V$SQL_PLAN에서 X03을 쓰는 SQL은 「영수증 재출력」 하나만 보인다

원본 SQL ​

sql
-- 「영수증 재출력」 (매장 POS · 하루 약 6천 번)
SELECT ITEM_ID, ORD_ITEM_QTY
  FROM ORD_ITEM
 WHERE ORD_NO = :v_ord_no
 ORDER BY ITEM_ID;

-- 2년 전 만든 인덱스
CREATE INDEX ORD_ITEM_X03 ON ORD_ITEM (ORD_NO);

실행계획 학습용 예시 ​

xplan
---------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |              |      1 |        |      3 |00:00:00.01 |       4 |
|   1 |  SORT ORDER BY                       |              |      1 |      3 |      3 |00:00:00.01 |       4 |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| ORD_ITEM     |      1 |      3 |      3 |00:00:00.01 |       4 |
|*  3 |    INDEX RANGE SCAN                  | ORD_ITEM_X03 |      1 |      3 |      3 |00:00:00.01 |       3 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("ORD_NO"=:V_ORD_NO)

문제 ​

  1. 개발자의 걱정(PK가 두 컬럼이라 주문번호 하나로는 못 탄다)이 맞는지 결합 인덱스의 선두 컬럼으로 설명하시오.
  2. ORD_ITEM_X03을 정리하는 절차를 작성하고, 지웠을 때 얻는 것과 지우기 전에 확인할 것을 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자