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

2주 동안 USED가 NO로 나온 인덱스 셋을 지우겠다는 정리안이 올라왔다

기초DDL한빛유통140 / 700

상황 ​

조민우가 인덱스 정리를 맡았다. 10월 7일(월) 아침 한빛유통 스키마의 인덱스 22개에 ALTER INDEX … MONITORING USAGE를 걸고, 2주 뒤 V$OBJECT_USAGE에서 USED가 NO인 셋을 골라 정리안을 올렸다. "2주 동안 한 번도 쓰이지 않았으니 지운다. 적재 비용과 공간이 준다." 박팀장은 지우기 전에 셋을 하나씩 판단해 오라고 했다.

테이블과 인덱스 ​

  • T_ITM_EVL 상품평가: 5,000행 · 48블록 · PK_T_ITM_EVL (ITM_ID, EVL_LST_NO) · UX_ITM_EVL_CUS (ITM_ID, CUS_ID): UNIQUE 인덱스 · 2021년 "고객은 상품마다 평가를 한 번만 남긴다"는 규칙을 넣을 때 만들었다 · 제약은 선언하지 않았고, 평가 등록 프로그램은 중복을 따로 확인하지 않고 INSERT한다
  • T_ORD 주문: 100,000행 · 896블록 · IX_T_ORD_PAY_DT (PAY_DT): 2023년 승인서에 "「월 결제 대사」 배치용(매월 1일 06:00, 지난달 결제를 PAY_DT 범위로 읽는다)"이라고 적혀 있다
  • T_ORD_DET 주문상세: 200,000행 · 896블록 · IX_T_ORD_DET_QTY (ORD_QTY): 2022년 「대량 주문 찾기」 실험 때 만든 것으로 보인다 · 이 이름을 쓰는 프로그램이 소스에 없고, AWR에 남은 6개월 치 실행계획(DBA_HIST_SQL_PLAN)에도 없다
  • 세 인덱스 모두 FK와는 상관없다 · 주문은 하루 약 137건, 주문상세는 약 270행, 상품평가는 약 30건이 INSERT된다

원본 SQL ​

sql
-- 조민우 정리안 (10월 21일)
DROP INDEX UX_ITM_EVL_CUS;
DROP INDEX IX_T_ORD_PAY_DT;
DROP INDEX IX_T_ORD_DET_QTY;

실행계획 학습용 예시 ​

xplan
[V$OBJECT_USAGE · 10월 21일(월) 09:00 · sqlp 계정으로 조회]
INDEX_NAME          TABLE_NAME   MONITORING  USED  START_MONITORING      END_MONITORING
------------------  -----------  ----------  ----  --------------------  --------------
UX_ITM_EVL_CUS      T_ITM_EVL    YES         NO    10/07/2024 09:10:12
IX_T_ORD_PAY_DT     T_ORD        YES         NO    10/07/2024 09:10:14
IX_T_ORD_DET_QTY    T_ORD_DET    YES         NO    10/07/2024 09:10:15
(나머지 19개는 USED = YES)

[같은 2주 동안 세 테이블의 DML]
T_ITM_EVL   INSERT 412건 · 그중 (ITM_ID, CUS_ID)가 겹쳐 ORA-00001로 거부된 INSERT 3건
T_ORD       INSERT 1,918건
T_ORD_DET   INSERT 3,804건

문제 ​

  1. V$OBJECT_USAGE의 USED = NO가 무엇을 뜻하고 무엇을 뜻하지 않는지 설명하시오.
  2. 세 인덱스를 각각 지운다, 남긴다, 더 지켜본다 가운데 하나로 판정하고 근거를 쓰시오.
  3. 판정에 맞게 정리안을 SQL로 다시 작성하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자