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

30일 사용 이력이 0인 인덱스를 지우면 POS 적재가 가벼워진다는 정리안이 올라왔다

중급DDL버거142 / 700

상황 ​

버거원 운영 주문 ORD_RANDOM에는 인덱스가 여섯 개 있다. POS 적재가 느리다는 말이 나오자 조민우가 DBA_INDEX_USAGE 30일 치를 뽑아 정리안을 올렸다. "사용 횟수가 0이거나 거의 없는 X04, X07, X08을 지운다. 인덱스가 여섯에서 셋으로 준다." 박팀장은 이렇게 답했다. "횟수만 보고 정하지 마라. 셋이 각각 왜 있는지, 그 횟수가 무슨 읽기였는지까지 보고 와라."

테이블과 인덱스 ​

  • ORD_RANDOM(운영본): 1,000,000행 · 22,414블록(블록당 약 45행) · 무작위 순서로 적재되어 시각이나 매장으로 시작하는 인덱스는 CLUSTERING_FACTOR가 약 1,000,000이다 · POS가 하루 약 1,370건을 INSERT하고, 매월 초 정정분 약 4만 건을 다시 넣는다
  • ORD_HMS VARCHAR2(6) '090000' ~ '225959'에 고르게 분포(한 시간에 약 7.1%) · 같은 조건을 FULL로 읽으면 22,234블록이다
  • SHOP 매장: 200행 · SHOP_PK (SHOP_NO) · FK FK_ORD_SHOP(ORD_RANDOM.SHOP_NO → SHOP.SHOP_NO, 2013년 선언, ENABLED) · 매년 1월 「매장 코드 정리」 배치가 개점이 취소된 매장 코드를 SHOP에서 지운다
  • 인덱스(승인서 기준): ORD_RANDOM_PK (ORD_NO) 영수증 조회 · ORD_RANDOM_X01 (ORD_DT, ORD_HMS) 일별 주문 조회 · ORD_RANDOM_X02 (ORD_DT, SHOP_NO) 월마감(매월 1일) · ORD_RANDOM_X04 (SHOP_NO) 2013년 FK를 선언할 때 만들었다 · ORD_RANDOM_X07 (ORD_HMS) 2019년 「시간대별 주문」 화면용(화면은 2022년에 없어졌다), 리프 약 2,500블록 · ORD_RANDOM_X08 (ORD_DT, ORD_HMS, SHOP_NO) 작년 클레임 조회 튜닝 실험 때 INVISIBLE로 만들어 두었다
  • 인덱스 하나는 정정분 4만 건 적재에 redo 약 9.4MB, 블록 변경 약 8만을 더한다(교재 04화 실측 비례) · DBA_INDEX_USAGE는 기본 설정(표본 수집)이다

원본 SQL ​

sql
-- 조민우 정리안 · DBA_INDEX_USAGE 30일 치 기준
DROP INDEX ORD_RANDOM_X04;   -- 0회
DROP INDEX ORD_RANDOM_X07;   -- 4회
DROP INDEX ORD_RANDOM_X08;   -- 0회

실행계획 학습용 예시 · 인덱스 규모와 CF는 교재 04화 실측 ​

xplan
[DBA_INDEX_USAGE · 9월 25일 ~ 10월 24일]
NAME              TOTAL_ACCESS_COUNT  TOTAL_ROWS_RETURNED  BUCKET_1000_PLUS_ACCESS_COUNT  LAST_USED
----------------  ------------------  -------------------  -----------------------------  -----------
ORD_RANDOM_PK              1,184,320            1,184,320                              0  10/24 21:58
ORD_RANDOM_X01                88,210            4,625,330                              0  10/24 21:57
ORD_RANDOM_X02                     1               41,666                              1  10/01 07:12
ORD_RANDOM_X04                     0                    0                              0
ORD_RANDOM_X07                     4              284,712                              4  10/14 16:40
ORD_RANDOM_X08                     0                    0                              0

[X07을 쓴 SQL · 분석팀 BI 도구 · 10월 14일 네 번]
SELECT SHOP_NO, COUNT(*) FROM ORD_RANDOM
 WHERE ORD_HMS BETWEEN '120000' AND '125959' GROUP BY SHOP_NO
-----------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                |      1 |        |    200 |00:00:01.92 |   71372 |
|   1 |  HASH GROUP BY                       |                |      1 |     78 |    200 |00:00:01.92 |   71372 |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| ORD_RANDOM     |      1 |     78 |  71178 |00:00:01.88 |   71372 |
|*  3 |    INDEX RANGE SCAN                  | ORD_RANDOM_X07 |      1 |     78 |  71178 |00:00:00.02 |     180 |
-----------------------------------------------------------------------------------------------------------------
   3 - access("ORD_HMS">='120000' AND "ORD_HMS"<='125959')

[USER_CONSTRAINTS · ORD_RANDOM의 FK]
CONSTRAINT_NAME  TYPE  COLUMN    R_CONSTRAINT  STATUS
FK_ORD_SHOP      R     SHOP_NO   SHOP_PK       ENABLED

문제 ​

  1. 정리안의 세 인덱스를 각각 지운다, 남긴다, 숨기고 지켜본다 가운데 하나로 판정하고 근거를 쓰시오. X04의 사용 횟수 0이 무엇을 놓치고 있는지 설명하시오.
  2. X07은 30일 동안 네 번 쓰였다. 그 네 번이 어떤 읽기였는지 위 숫자로 설명하고, X07이 없어지면 그 SQL이 어떻게 되는지 설명하시오.
  3. 판정에 맞는 정리 절차를 SQL로 작성하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자