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

「매장 생존 점검」이 POS가 멈춘 매장을 못 잡고, 1분마다 5천 블록을 읽는다

중급SELECT버거320 / 700

상황 ​

본사 운영실의 「매장 생존 점검」 화면은 매장마다 마지막 주문 일시를 보여 주고, 30분 넘게 주문이 없는 매장을 붉게 칠한다(POS 장애 감지용). 운영실 PC 6대가 1분마다 새로 고친다. 지난주 SH0117 매장의 POS가 두 시간 멈췄는데 화면은 붉어지지 않았다. 그 시간에도 SH0117의 마지막 주문 시각은 '23:58:41'로 떠 있었다.

테이블과 인덱스 ​

  • ORD 주문: 1,000,000행 · 22,422블록 · SHOP_NO 200곳('SH0001' ~ 'SH0200', 매장마다 약 5,000건) · ORD_DT VARCHAR2(8), ORD_HMS VARCHAR2(6) · 둘 다 NOT NULL이고 0 채움 정상
  • SHOP 매장: 200행 · 5블록 · PK (SHOP_NO) · SHOP_NM
  • 인덱스 ORD_PK (ORD_NO), ORD_X01 (ORD_DT, ORD_HMS), ORD_X02 (SHOP_NO, ORD_DT, ORD_HMS, ORD_NO): BLEVEL 2 · 리프 약 5,200블록(매장 하나에 약 26블록) · 통계 최신

원본 SQL ​

sql
SELECT s.SHOP_NO, s.SHOP_NM,
       MAX(o.ORD_DT)  AS last_dt,
       MAX(o.ORD_HMS) AS last_hms
  FROM SHOP s, ORD o
 WHERE o.SHOP_NO = s.SHOP_NO
 GROUP BY s.SHOP_NO, s.SHOP_NM
 ORDER BY last_dt, last_hms

실행계획 학습용 예시 ​

xplan
------------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |         |      1 |        |    200 |00:00:00.38 |    5233 |          |
|   1 |  SORT ORDER BY          |         |      1 |    200 |    200 |00:00:00.38 |    5233 |   18K (0)|
|   2 |   HASH GROUP BY         |         |      1 |    200 |    200 |00:00:00.38 |    5233 | 1394K (0)|
|*  3 |    HASH JOIN            |         |      1 |   1000K|   1000K|00:00:00.27 |    5233 | 1572K (0)|
|   4 |     TABLE ACCESS FULL   | SHOP    |      1 |    200 |    200 |00:00:00.01 |       5 |          |
|   5 |     INDEX FAST FULL SCAN| ORD_X02 |      1 |   1000K|   1000K|00:00:00.09 |    5228 |          |
------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("O"."SHOP_NO"="S"."SHOP_NO")

[화면 · SH0117 · POS 가 멈춘 날 14:20]  last_dt 20131216 · last_hms 235841  (실제 그날 마지막 주문: 20131216 120733)

문제 ​

  1. SH0117의 마지막 주문 시각이 '23:58:41'로 나온 까닭을 SQL로 설명하시오.
  2. 매장마다 마지막 주문 한 건의 일자와 시각을 정확히 돌려주면서, 매장마다 인덱스의 끝 항목 하나만 읽도록 SQL을 고치시오. GROUP BY의 MAX가 왜 인덱스 끝에서 멈추지 못하는지도 설명하시오.
  3. 고친 SQL의 일량이 매장 수와 주문 수에 따라 어떻게 늘어나는지 쓰고, 지금 SQL과 견주시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자