Skip to content
튜닝 연습소트 튜닝과 페이징
SORT-052

대시보드의 「월별 주문 금액 분포」가 새로 고칠 때마다 TEMP를 22MB 쓴다

기초SELECT한빛유통357 / 700

상황 ​

경영지원팀 대시보드에 지난달 「월별 주문 금액 분포」 칸이 생겼다. 2022 ~ 2024년 36개월의 달마다 주문 금액 중앙값과 상위 10% 경계(90번째 백분위수)를 꺾은선으로 그린다. 평균은 고액 주문 몇 건에 끌려가니 분포를 보자는 박팀장의 요청이었다. 화면은 07시부터 19시까지 5분마다 새로 고친다. 그 뒤로 DBA가 뽑는 TEMP 사용 상위 목록에 이 SQL이 매번 오른다. 새로 고칠 때마다 TEMP를 22MB 쓰고 0.6초가 걸린다. 조민우는 "추세만 보는 그래프인데 원 단위까지 맞아야 하나"라고 묻는다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_DT DATE(전부 자정, 2022-01-01 ~ 2024-12-31) · ORD_AMT 1만 ~ 50만 원에 고르게 퍼져 있다(100원 단위) · 한 달 약 2만 7천 건
  • 이 화면에 쓸 인덱스는 없다. 낮 시간 work area 하나의 상한(global memory bound)은 약 20MB다. 통계는 최신이다.
  • 같은 두 숫자를 매월 1일 08시의 월 마감 보고서(임원 보고용)도 지난달 한 달 치로 쓴다.

원본 SQL ​

sql
SELECT TRUNC(ORD_DT, 'MM') AS ORD_MM,
       MEDIAN(ORD_AMT)                                       AS AMT_P50,
       PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY ORD_AMT) AS AMT_P90
  FROM T_ORD_BIG
 GROUP BY TRUNC(ORD_DT, 'MM')
 ORDER BY ORD_MM

실행계획 학습용 예시 · 정확한 백분위수와 근사 백분위수의 메모리 차이는 교재 환경 23ai의 100만 행 실측 비율 ​

xplan
--------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads | Writes |  OMem |  1Mem | Used-Mem | Used-Tmp|
--------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |      1 |        |     36 |00:00:00.61 |    5831 |  4928 |   4928 |       |       |          |         |
|   1 |  SORT GROUP BY     |           |      1 |   1096 |     36 |00:00:00.61 |    5831 |  4928 |   4928 |    65M|  1709K|   20M (1)|      22M|
|   2 |   TABLE ACCESS FULL| T_ORD_BIG |      1 |   1000K|   1000K|00:00:00.05 |    5826 |     0 |      0 |       |       |          |         |
--------------------------------------------------------------------------------------------------------------------------------------------

문제 ​

  1. 1번 줄이 TEMP를 쓰는 까닭을 중앙값과 백분위수를 구하는 방식, 그리고 OMem과 Used-Mem으로 설명하시오.
  2. 대시보드 그래프의 정렬 부담을 줄이도록 SQL을 고치고, 고친 뒤에도 그대로 남는 일량이 무엇인지 쓰시오.
  3. 고친 방식을 써도 되는 곳과 쓰면 안 되는 곳을 이 회사의 두 화면으로 구분하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자