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

「고액 판매 TOP 100」을 월요일 아침에 열면 TEMP 경보가 울린다

중급SELECT유통313 / 700

상황 ​

본사 영업관리팀의 「고액 판매 TOP 100」 화면은 판매상품 가운데 수량 × 단가가 큰 100줄을 보여 준다. 월요일 9시 주간 회의 직전에 팀원 12명이 한꺼번에 열고, 그 시간마다 DBA에게 TEMP 사용량 경보가 온다. 개발자는 회사 공통 페이징 틀(안쪽에서 정렬하고, 가운데에서 ROWNUM을 번호로 붙이고, 바깥에서 그 번호로 거른다)을 그대로 가져다 썼다. 화면은 한 페이지뿐이다.

테이블과 인덱스 ​

  • CF11 판매상품: 1,096,708행 · 8,204블록 · SLE_NO VARCHAR2(15) · ITM_NO · SLE_QTY · SLE_UPRC · CF11_PK (SLE_NO, ITM_NO) · 다른 인덱스 없음 · 통계 최신
  • 월요일 9시에는 여러 세션이 동시에 정렬과 해시 조인을 해서, work area 하나가 쓸 수 있는 메모리(V$PGASTAT의 global memory bound)가 약 20MB로 내려간다. 한가한 시간에는 약 100MB다

원본 SQL ​

sql
SELECT *
  FROM (SELECT ROWNUM AS rn, a.*
          FROM (SELECT SLE_NO, ITM_NO, SLE_QTY, SLE_UPRC,
                       SLE_QTY * SLE_UPRC AS SLE_AMT
                  FROM CF11
                 ORDER BY SLE_QTY * SLE_UPRC DESC) a)
 WHERE rn <= 100

실행계획 학습용 예시 · 메모리 크기는 교재 09화 실측 규모 ​

xplan
[월요일 09:01]
-------------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem | Used-Mem | Used-Tmp|
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |      1 |        |    100 |00:00:02.41 |    8204 |       |          |         |
|*  1 |  VIEW                 |      |      1 |   1096K|    100 |00:00:02.41 |    8204 |       |          |         |
|   2 |   COUNT               |      |      1 |        |   1096K|00:00:02.22 |    8204 |       |          |         |
|   3 |    VIEW               |      |      1 |   1096K|   1096K|00:00:02.05 |    8204 |       |          |         |
|   4 |     SORT ORDER BY     |      |      1 |   1096K|   1096K|00:00:01.88 |    8204 |    61M|   20M (1)|      55M|
|   5 |      TABLE ACCESS FULL| CF11 |      1 |   1096K|   1096K|00:00:00.19 |    8204 |       |          |         |
-------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("RN"<=100)

[같은 SQL · 화요일 15시]  4번 줄 Used-Mem 54M (0) · Used-Tmp 없음 · A-Time 0.92초 · Buffers 8,204

문제 ​

  1. 이 화면이 정렬하는 행 수와 메모리, TEMP 사용량을 실행계획에서 읽고, 100줄만 보여 주는 화면인데 왜 전체를 정렬하는지 설명하시오.
  2. 같은 100줄을 돌려주면서 정렬 메모리가 100줄만큼만 들도록 SQL을 고치시오.
  3. 고친 뒤에도 Buffers가 8,204인 이유를 설명하고, 읽는 양까지 줄이려면 무엇이 필요하며 그만한 가치가 있는지 판단하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자