Skip to content
튜닝 연습인덱스 사용 조건
IDX-018

고칠 수 없는 BI 차트 SQL이 월 판매를 볼 때마다 판매 전체를 읽는다

실전DDL유통18 / 700

상황 ​

유통 본사가 셀프서비스 BI 도구를 들였다. MD들이 「월 판매」 차트에서 연도와 월을 고르면 도구가 SQL을 만든다. BI 관리자는 데이터 원본 정의(계산 필드, 필드 타입)와 필터 종류는 바꿀 수 있지만, 차트마다 SQL을 손으로 쓸 수는 없다. 판매일자가 문자라서 관리자는 TO_DATE(SLE_DT, 'YYYYMMDD')를 계산 필드 「판매일」로 정의해 두었다. MD 30명이 차트를 열 때마다 아래 SQL이 나간다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록(전체 스캔 4,510) · SLE_DT VARCHAR2(8) · SHP_NO 매장 5곳 · 2023년 6월 20,953건
  • 인덱스 CF10_PK (SLE_NO) · IX_CF10_SLE_DT (SLE_DT): BLEVEL 2 · 리프 1,393 · CF 9,921 · 통계 최신
  • 판매는 POS 판매 등록 프로그램이 한 건씩 넣고(하루 약 700건), 지난 자료는 sqlldr로 넣었다(CF10.ctl에는 컬럼 목록이 적혀 있다). POS 프로그램의 INSERT 모양은 아직 확인하지 않았다

원본 SQL ​

sql
SELECT "SHP_NO", COUNT(*) AS "CNT"
  FROM "CF10"
 WHERE EXTRACT(YEAR FROM TO_DATE("SLE_DT", 'YYYYMMDD')) = 2023
   AND EXTRACT(MONTH FROM TO_DATE("SLE_DT", 'YYYYMMDD')) = 6
 GROUP BY "SHP_NO"

실행계획 학습용 예시 · 건수는 적재 데이터, 가상 컬럼 수치는 교재 03화 실측 ​

xplan
-----------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |      5 |00:00:00.09 |    4510 |
|   1 |  HASH GROUP BY     |      |      1 |      5 |      5 |00:00:00.09 |    4510 |
|*  2 |   TABLE ACCESS FULL| CF10 |      1 |     50 |  20953 |00:00:00.08 |    4510 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter((EXTRACT(YEAR FROM TO_DATE("SLE_DT",'YYYYMMDD'))=2023 AND
              EXTRACT(MONTH FROM TO_DATE("SLE_DT",'YYYYMMDD'))=6))

문제 ​

  1. BI가 만든 SQL이 IX_CF10_SLE_DT를 쓰지 못하는 이유와 E-Rows가 50으로 나온 이유를 설명하시오.
  2. SQL을 손으로 고칠 수 없다는 조건에서 쓸 수 있는 방법(BI가 만든 식 그대로의 함수 기반 인덱스, 가상 컬럼과 BI 필터 설정, 요약 테이블)을 비교하고, 고른 방법의 DDL과 BI 쪽 설정을 쓰시오.
  3. 고른 방법이 POS 판매 등록과 적재 작업에 주는 영향과, 반영 전에 확인할 것을 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자