Skip to content
튜닝 연습DML과 배치 튜닝
DML-050

콜센터 주문상품 10만 행을 POS 쪽으로 옮기는 데 11.8초, 그중 대부분이 트리거 안의 조회다

중급INSERT버거475 / 700

상황 ​

버거원 본사는 따로 돌던 콜센터(전화 주문) 시스템을 POS 쪽으로 합친다. 콜센터의 지난 1년 주문은 이미 ORD에 옮겼고, 이번에는 그 주문상품 102,416행을 ORD_ITEM에 옮긴다. 리허설에서 이 단계가 11.8초 걸렸다. 반영은 다음 주 화요일 14:00이고, 그 시간에도 매장 POS가 ORD_ITEM에 계속 넣는다. ORD_ITEM의 ORD_DT와 ORD_HMS는 ORD에서 복사해 둔 칸(반정규화)이다. POS 앱은 이 두 칸을 보내지 않으므로, 2015년부터 행 트리거가 ORD를 찾아 채운다.

테이블과 인덱스 ​

  • ORD_ITEM 주문상품: 2,472,717행 · 55,265블록 · ORD_ITEM_PK (ORD_NO, ITEM_ID) · ORD_ITEM_X01 (ORD_DT, ORD_HMS) · 행 트리거 TRG_ORD_ITEM_BI
  • ORD 주문: 이 문제에서는 콜센터 주문 41,060건이 더 들어가 1,041,060행 · 23,340블록이다. ORD_PK (ORD_NO)
  • STG_CALL_ITEM 콜센터 주문상품: 102,416행 · 512블록 · ORD_NO · ITEM_ID · QTY. 모든 ORD_NO가 ORD에 있다.
  • 영업 시간에는 200개 매장 POS가 초당 1건 남짓 ORD_ITEM에 넣는다. FK는 없다.

원본 SQL ​

sql
-- 2015년부터 있는 트리거
CREATE OR REPLACE TRIGGER TRG_ORD_ITEM_BI
BEFORE INSERT ON ORD_ITEM
FOR EACH ROW
BEGIN
  SELECT ORD_DT, ORD_HMS
    INTO :NEW.ORD_DT, :NEW.ORD_HMS
    FROM ORD
   WHERE ORD_NO = :NEW.ORD_NO;
END;

-- 콜센터 주문상품 이관 (리허설)
INSERT INTO ORD_ITEM (ORD_NO, ITEM_ID, ORD_ITEM_QTY)
SELECT ORD_NO, ITEM_ID, QTY
  FROM STG_CALL_ITEM;
COMMIT;

실행계획 학습용 예시 ​

xplan
--------------------------------------------------------------------------------------------------
| Id  | Operation                | Name         | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |              |      1 |        |      0 |00:00:11.78 |   1046K |
|   1 |  LOAD TABLE CONVENTIONAL | ORD_ITEM     |      1 |        |      0 |00:00:11.78 |   1046K |
|   2 |   TABLE ACCESS FULL      | STG_CALL_ITEM |      1 |    102K|    102K|00:00:00.02 |     512 |
--------------------------------------------------------------------------------------------------

[세션 통계 — 리허설 한 번]
  경과 시간                 11.78 초
  CPU used by this session   9.62 초
  recursive calls          103,264
  session logical reads    1,046,310
  redo size                 96.4 MB

[TKPROF — 트리거 안의 문장]
SELECT ORD_DT, ORD_HMS FROM ORD WHERE ORD_NO = :B1
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Execute 102416      1.92       2.10          0          0          0           0
Fetch   102416      1.41       1.55          0     307248          0      102416

문제 ​

  1. 11.8초 가운데 무엇이 행마다 반복되는지 TKPROF와 세션 통계로 설명하시오.
  2. 매장 POS가 계속 넣는 시간에 반영한다는 조건을 지키면서 이관 SQL과 트리거를 고치시오.
  3. 고친 뒤에도 남는 비용이 있으면 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자