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

매장과 요일, 시간대를 골라 판매 건수 하나를 세는데 분석 사본을 통째로 읽는다

기초SELECT유통130 / 700

상황 ​

본사 영업기획팀은 BI 도구의 「판매 건수 조회」에서 매장, 요일, 시간대, 월을 마음대로 골라 판매 건수를 센다. 고르는 조합이 매번 달라서 하루 약 3,000번, 서로 다른 모양의 COUNT가 들어온다. 운영 판매 테이블을 건드리지 않으려고 매일 새벽 분석 사본 CF10_DW를 다시 만들어 쓰는데, 건수 하나에 사본 전체를 읽는다. 조민우는 "자주 쓰는 조합마다 결합 인덱스를 만들자"고 한다. 아래는 매장 1003, 토요일, 12시대다.

테이블과 인덱스 ​

  • CF10_DW 판매 분석 사본: 매일 04:00에 CF10에서 CTAS로 다시 만든다 · 낮에는 읽기만 한다 · 500,000행 · 5,040블록 · CF10 컬럼에 시간대 SLE_HH(SUBSTR(SLE_HMS, 1, 2))와 월 SLE_YM을 더했다
  • 분포: SHP_NO 다섯 곳에 약 10만 건씩 · SLE_DOW 일곱 값에 약 14%씩 · SLE_HH 14가지이고 12시대가 약 52% · SLE_YM 24가지
  • 매장 1003의 토요일 12시대: 7,488건
  • 인덱스는 없다 · 통계 최신

원본 SQL ​

sql
SELECT COUNT(*)
  FROM CF10_DW
 WHERE SHP_NO  = :v_shp
   AND SLE_DOW = :v_dow
   AND SLE_HH  = :v_hh

실행계획 학습용 예시 · 시간대 분포는 문제에 적은 값 · 비트맵 블록 수는 어림값 ​

xplan
------------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |      1 |        |      1 |00:00:00.03 |    5040 |
|   1 |  SORT AGGREGATE     |         |      1 |      1 |      1 |00:00:00.03 |    5040 |
|*  2 |   TABLE ACCESS FULL | CF10_DW |      1 |   1020 |   7488 |00:00:00.03 |    5040 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(("SLE_HH"=:V_HH AND "SLE_DOW"=:V_DOW AND "SHP_NO"=:V_SHP))

문제 ​

  1. 조합마다 결합 B-tree 인덱스를 만드는 방법이 이 화면에 맞지 않는 이유를 설명하시오.
  2. 어떤 조합이 와도 테이블을 읽지 않고 건수를 셀 수 있도록 인덱스를 설계해 DDL을 작성하시오. 운영 CF10에 같은 인덱스를 만들면 안 되는 이유도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자