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

휴면 고객 판정 배치가 고객 주문 인덱스를 통째로 읽는데, 인덱스를 압축하면 얼마나 주느냐고 묻는다

기초DDL한빛유통135 / 700

상황 ​

매일 밤 「휴면 고객 판정」 배치는 고객마다 마지막 주문일을 구해 여섯 달 넘게 주문이 없는 고객을 휴면으로 바꾼다. 이 단계가 고객 주문 인덱스를 처음부터 끝까지 읽는다. 오과장이 묻는다. "05화에서 인덱스가 테이블보다 크다고 했지. 이 인덱스를 압축하면 얼마나 줄고 무엇이 빨라지나? 압축 컬럼 수는 몇으로 하나?"

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · CUS_ID VARCHAR2(40)의 값은 'CUS_000123' 꼴 10글자 · 고객 2,000명, 고객당 500건 · 고객 한 명의 주문은 219개 날짜에 몰려 있다(한 날짜에 2 ~ 3건)
  • 인덱스 IX_ORD_BIG_CUS_DT (CUS_ID, ORD_DT): BLEVEL 2 · 리프 약 4,110블록(리프 한 블록에 약 243항목) · 압축하지 않았다 · 통계 최신
  • 이 인덱스를 쓰는 SQL: 휴면 판정 배치(하루 1번) · 「고객 주문 이력」(고객 한 명의 한 달, 하루 약 6천 번) · 주문은 운영에서 계속 INSERT된다

원본 SQL ​

sql
SELECT CUS_ID, MAX(ORD_DT) AS last_ord_dt
  FROM T_ORD_BIG
 GROUP BY CUS_ID

실행계획 학습용 예시 · 고객별 분포는 적재 스크립트 그대로 · 압축 뒤 리프 수는 어림값 ​

xplan
---------------------------------------------------------------------------------------------------
| Id  | Operation              | Name              | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                   |      1 |        |   2000 |00:00:00.21 |    4128 |
|   1 |  HASH GROUP BY         |                   |      1 |   2000 |   2000 |00:00:00.21 |    4128 |
|   2 |   INDEX FAST FULL SCAN | IX_ORD_BIG_CUS_DT |      1 |   1000K|   1000K|00:00:00.08 |    4128 |
---------------------------------------------------------------------------------------------------

문제 ​

  1. 인덱스 키 압축(COMPRESS n)이 리프 블록에서 무엇을 줄이는지 설명하고, 이 인덱스에서 압축할 컬럼 수를 컬럼별 값의 반복 정도로 정하시오.
  2. 압축 DDL을 작성하고, 압축 뒤 휴면 판정 배치와 「고객 주문 이력」의 읽는 양이 각각 어떻게 되는지와 압축의 대가를 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자