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

주문 인덱스 셋을 압축했더니 하나는 반으로 줄고, 하나는 오히려 커지고, 하나는 에러가 났다

중급DDL버거136 / 700

상황 ​

버거원 DBA가 저장 공간을 줄이려고 운영 주문 테이블 ORD_RANDOM의 인덱스 셋을 압축하는 스크립트를 일요일 09:00에 돌렸다. "두 컬럼짜리는 COMPRESS 2, 한 컬럼짜리는 COMPRESS 1." 결과는 셋이 다 달랐고, 그동안 문을 연 매장의 POS 결제가 몇 초씩 멈췄다는 문의도 들어왔다. 박팀장은 "결과를 설명하고, 고친 스크립트와 다음부터 운영을 막지 않고 미리 재는 방법을 적어 와라"고 했다.

테이블과 인덱스 ​

  • ORD_RANDOM(운영 주문): 1,000,000행 · 22,414블록 · 순서 없이 쌓였다 · ORD_DT VARCHAR2(8) 730일, 하루 약 1,370건 · ORD_HMS VARCHAR2(6)이 09:00:00 ~ 22:59:59에 고르게 분포 · SHOP_NO 200곳에 고르게 · POS가 주문을 계속 INSERT한다
  • ORD_RANDOM_PK (ORD_NO): 유일 인덱스 · 리프 약 2,080블록
  • ORD_RANDOM_X01 (ORD_DT, ORD_HMS): 리프 3,774블록 · 「일별 주문 조회」가 쓴다(첫 화면 1,378블록 가운데 대부분이 테이블 블록, ACC-027)
  • ORD_RANDOM_X02 (ORD_DT, SHOP_NO): 리프 3,774블록 · 월마감 「가맹점별 주문 건수」가 쓴다(한 달 160블록)
  • 보관본 ORD: 같은 데이터에 같은 정의의 인덱스(ORD_X01, ORD_X02) · 운영 SQL은 쓰지 않는다

원본 SQL ​

sql
-- 일요일 09:00 DBA 스크립트
ALTER INDEX ORD_RANDOM_PK  REBUILD COMPRESS 1;
ALTER INDEX ORD_RANDOM_X01 REBUILD COMPRESS 2;
ALTER INDEX ORD_RANDOM_X02 REBUILD COMPRESS 2;

실행계획 학습용 예시 · 압축 전 리프 수는 교재 04화 실측 · 압축 뒤 리프 수는 어림값 ​

xplan
[스크립트 결과]
ALTER INDEX ORD_RANDOM_PK  REBUILD COMPRESS 1
  ORA-25194: invalid COMPRESS prefix length value
ALTER INDEX ORD_RANDOM_X01 REBUILD COMPRESS 2      (09:00:02 ~ 09:00:09)
  LEAF_BLOCKS 3,774 → 4,570
ALTER INDEX ORD_RANDOM_X02 REBUILD COMPRESS 2      (09:00:09 ~ 09:00:15)
  LEAF_BLOCKS 3,774 → 1,990

[그 뒤 SQL]
월마감 · 2013년 12월         ORD_RANDOM_X02 INDEX RANGE SCAN          Buffers 160 → 84
일별 주문 조회 · 첫 화면      ORD_RANDOM_X01 + TABLE ACCESS BY ROWID   Buffers 1,378 → 1,379

[09:00:02 ~ 09:00:15 POS 결제 세션]
enq: TM - contention 대기 · 결제 응답 평균 0.4초 → 최대 7초

문제 ​

  1. 세 인덱스의 결과가 갈린 이유를 각 인덱스의 컬럼 구성과 값의 되풀이로 설명하시오. 월마감은 반으로 줄었는데 일별 주문 조회는 그대로인 이유도 설명하시오.
  2. 고친 스크립트를 작성하시오. POS 결제가 멈춘 이유와, 다음부터 압축할 컬럼 수를 운영을 막지 않고 미리 재는 방법도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자