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

정산 목록 화면이 1페이지는 괜찮은데 100페이지쯤 가면 멈춘 듯 느리다

중급SELECT한빛유통306 / 700

상황 ​

정산 목록 화면은 최신 주문부터 한 페이지에 10건씩 보여 주고, 화면 아래에 "총 n건"을 띄운다. 1페이지는 괜찮은데 100페이지쯤 가면 화면이 멈춘 듯 느리다고 한다. 화면은 클릭할 때마다 아래 두 SQL을 보낸다. 아래는 100페이지(991 ~ 1,000번째 행)를 가져올 때의 모습이다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록. ORD_SEQ는 유일하고, 인덱스는 없다.
  • 정렬 기준은 ORD_DT DESC, ORD_SEQ DESC다(같은 날짜 안에서는 번호 역순).

원본 SQL ​

sql
SELECT *
  FROM (SELECT ROWNUM rn, a.*
          FROM (SELECT ORD_SEQ, CUS_ID, ORD_DT, ORD_AMT
                  FROM T_ORD_BIG
                 ORDER BY ORD_DT DESC, ORD_SEQ DESC) a
         WHERE ROWNUM <= 1000)
 WHERE rn > 990;

SELECT COUNT(*) FROM T_ORD_BIG;

실행계획 예시 · 교재 09화 규모 ​

xplan
[목록 — 100페이지]
------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |           |      1 |        |     10 |00:00:00.21 |    5826 |          |
|*  1 |  VIEW                    |           |      1 |   1000 |     10 |00:00:00.21 |    5826 |          |
|*  2 |   COUNT STOPKEY          |           |      1 |        |   1000 |00:00:00.21 |    5826 |          |
|   3 |    VIEW                  |           |      1 |   1000K|   1000 |00:00:00.21 |    5826 |          |
|*  4 |     SORT ORDER BY STOPKEY|           |      1 |   1000K|   1000 |00:00:00.21 |    5826 |  142K (0)|
|   5 |      TABLE ACCESS FULL   | T_ORD_BIG |      1 |   1000K|   1000K|00:00:00.05 |    5826 |          |
------------------------------------------------------------------------------------------------------------
   1 - filter("RN">990)
   2 - filter(ROWNUM<=1000)
   4 - filter(ROWNUM<=1000)

[총건수]
------------------------------------------------------------------------------------
| Id  | Operation          | Name      | Starts | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |      1 |      1 |00:00:00.04 |    5826 |
|   1 |  SORT AGGREGATE    |           |      1 |      1 |00:00:00.04 |    5826 |
|   2 |   TABLE ACCESS FULL| T_ORD_BIG |      1 |   1000K|00:00:00.04 |    5826 |
------------------------------------------------------------------------------------

문제 ​

  1. 한 번 클릭할 때 몇 블록을 읽는지, 페이지가 뒤로 갈수록 무엇이 늘어나는지 설명하시오.
  2. 어느 페이지든 일량이 비슷하도록 목록 SQL과 인덱스를 고치고, 총건수 SQL은 어떻게 처리할지 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자