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

매장이 두 배로 늘면 인덱스가 깊어진다며 판매 테이블을 연도별로 쪼개자고 한다

기초SELECT유통143 / 700

상황 ​

유통 본사는 내년에 매장 다섯 곳을 더 연다. 판매는 지금의 두 배(하루 약 1,400건)가 될 것으로 본다. 조민우는 이렇게 제안했다. "CF10이 커지면 인덱스가 깊어져서 「일 시간대별 판매」가 느려진다. 해가 바뀔 때마다 CF10_2024처럼 연도별 테이블로 나누고, 화면에서 연도를 골라 읽게 하자." 「일 시간대별 판매」는 날짜 하나를 고르면 시간대별 판매 건수를 보여 주는 화면으로, 매장과 본사에서 하루 수백 번 연다. 박팀장은 판매가 두 배, 열 배가 되면 이 화면이 몇 블록을 읽게 되는지부터 어림해 오라고 했다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록 · 판매 날짜순으로 쌓였다 · 2022-01-01 ~ 2023-12-31 · 하루 596 ~ 793건 · 2023-06-01 706건이 13블록에 모여 있다
  • IX_CF10_SLE_DT (SLE_DT): BLEVEL 2 · 리프 1,393블록(리프 한 블록에 약 359항목) · CLUSTERING_FACTOR 9,921(교재 03화 실측) · 통계 최신
  • 복사본에서 잰 INDEX_STATS: HEIGHT 3 · 브랜치 블록 5개(루트 1 + 그 아래 4) · 브랜치 블록 하나에 아래 블록 주소가 최대 약 460개 들어간다
  • 늘어난 판매도 지금처럼 날짜순으로 쌓인다고 본다

원본 SQL ​

sql
-- 「일 시간대별 판매」 · 하루 수백 번
SELECT SUBSTR(SLE_HMS, 1, 2) AS hh, COUNT(*) AS sle_cnt
  FROM CF10
 WHERE SLE_DT = :v_dt
 GROUP BY SUBSTR(SLE_HMS, 1, 2)
 ORDER BY hh

실행계획 학습용 예시 · 건수와 블록은 적재 데이터(CF10)와 교재 03화 실측 ​

xplan
[2023-06-01 · 706건]
-----------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                |      1 |        |     14 |00:00:00.01 |      18 |
|   1 |  SORT GROUP BY                       |                |      1 |     14 |     14 |00:00:00.01 |      18 |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| CF10           |      1 |    685 |    706 |00:00:00.01 |      18 |
|*  3 |    INDEX RANGE SCAN                  | IX_CF10_SLE_DT |      1 |    685 |    706 |00:00:00.01 |       5 |
-----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("SLE_DT"=:V_DT)

문제 ​

  1. 3번 줄의 5블록과 2번 줄의 13블록이 각각 무엇인지 나누어 설명하시오. 판매가 두 배, 열 배가 되면 두 줄이 각각 몇 블록이 될지 어림하시오.
  2. 인덱스 높이(HEIGHT)가 하나 늘어나는 것은 리프가 몇 개쯤일 때인지 계산하시오.
  3. 조민우의 제안을 받아들일지, 이 화면의 일량이 무엇에 비례하는지를 근거로 판단하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자