Skip to content
튜닝 연습서브쿼리와 쿼리 변환
SUBQ-060

주문 보관 테이블이 생긴 뒤로 매장 월 정산 집계가 4초씩 걸리고 TEMP를 쓴다

기초DDL버거295 / 700

상황 ​

버거 본사는 작년 말 2012년 주문을 보관 테이블 ORD_ARC로 옮기고, 화면과 배치가 두 해를 함께 볼 수 있게 뷰 V_ORD_ALL을 만들었다. 그 뒤로 「매장 월 정산 집계」(2년 치 매장 × 월 주문 수, 하루 40번)가 0.7초에서 4.1초로 느려졌고, 돌 때마다 TEMP를 40MB 넘게 쓴다. 뷰를 만든 개발자는 "두 테이블에 같은 주문이 들어 있을까 봐 UNION으로 묶었다"라고 했다.

테이블과 인덱스 ​

  • ORD 주문 (이 문제의 설정): 2013년 주문만 남았다 · 500,218행 · 11,216블록 · ORD_PK (ORD_NO)
  • ORD_ARC 보관 주문 (파생 테이블): ORD와 같은 구조 · 2012년 주문 499,782행 · 11,206블록 · ORD_ARC_PK (ORD_NO) · 옮긴 주문은 ORD에서 지웠다
  • 두 테이블을 합치면 schemas.md의 ORD(1,000,000행 · 22,422블록)와 같다 · 주문번호는 한 번 쓰면 다시 쓰지 않는다
  • pga_aggregate_target 512M · AUTO · 통계 최신

원본 SQL ​

sql
CREATE OR REPLACE VIEW V_ORD_ALL AS
SELECT ORD_NO, ORD_DT, ORD_HMS, SHOP_NO FROM ORD
UNION
SELECT ORD_NO, ORD_DT, ORD_HMS, SHOP_NO FROM ORD_ARC;

-- 매장 월 정산 집계 (하루 40번)
SELECT SHOP_NO, SUBSTR(ORD_DT, 1, 6) AS ORD_YM, COUNT(*) AS ORD_CNT
  FROM V_ORD_ALL
 GROUP BY SHOP_NO, SUBSTR(ORD_DT, 1, 6);

실행계획 학습용 예시 ​

xplan
[매장 월 정산 집계]
----------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name      | Starts | E-Rows | A-Rows |      A-Time | Buffers | Reads | Writes |  Used-Mem | Used-Tmp |
----------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |           |      1 |        |   4800 | 00:00:04.12 |   22422 |  5376 |   5376 |           |          |
|   1 |  HASH GROUP BY          |           |      1 |   4800 |   4800 | 00:00:04.12 |   22422 |  5376 |   5376 | 1934K (0) |          |
|   2 |   VIEW                  | V_ORD_ALL |      1 |  1000K |  1000K | 00:00:03.87 |   22422 |  5376 |   5376 |           |          |
|   3 |    SORT UNIQUE          |           |      1 |  1000K |  1000K | 00:00:03.71 |   22422 |  5376 |   5376 |   23M (1) |      42M |
|   4 |     UNION-ALL           |           |      1 |        |  1000K | 00:00:00.38 |   22422 |     0 |      0 |           |          |
|   5 |      TABLE ACCESS FULL  | ORD       |      1 |   500K |   500K | 00:00:00.17 |   11216 |     0 |      0 |           |          |
|   6 |      TABLE ACCESS FULL  | ORD_ARC   |      1 |   500K |   500K | 00:00:00.16 |   11206 |     0 |      0 |           |          |
----------------------------------------------------------------------------------------------------------------------------------------

문제 ​

  1. 4.1초와 TEMP 사용이 어느 줄에서 나오는지 설명하고, 개발자가 걱정한 '같은 주문'이 실제로 생길 수 있는지 판단하시오.
  2. 뷰를 고치고, 고친 뷰가 원래 뷰와 같은 결과를 낸다는 것을 어떻게 확인할지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자