Skip to content
튜닝 연습PL/SQL과 사용자 정의 함수
PLSQL-036

판매 전표 조회 화면에서 1년을 고르면 첫 페이지 50건이 뜨기까지 8초가 걸린다

중급PLSQL유통686 / 700

상황 ​

본사 「판매 전표 조회」 화면(Java)은 기간을 고르면 프로시저 P_SLE_LIST를 부르고, 받은 전표를 최근 것부터 한 페이지에 50건씩 보여 준다. 화면 로그를 보면 조회의 95%가 첫 페이지만 보고 닫힌다. 프로시저는 기간의 전표를 컬렉션에 담아 OUT 인자로 돌려준다. 한 달을 고르면 1초, 1년을 고르면 첫 페이지가 뜨기까지 8초 가까이 걸린다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록(블록당 약 109행) · SLE_DT VARCHAR2(8) · 날짜순으로 쌓였다 · 2023년 249,971건
  • 인덱스 IX_CF10_DT_NO (SLE_DT, SLE_NO): 이 문제에서는 있다 · 리프 2,380블록 · 통계 최신
  • SQL 타입 T_SLE_OBJ (SLE_NO, SLE_DT, SLE_HMS, SHP_NO)와 T_SLE_TAB(TABLE OF T_SLE_OBJ)

원본 SQL ​

sql
PROCEDURE P_SLE_LIST(p_fr IN VARCHAR2, p_to IN VARCHAR2, o_list OUT T_SLE_TAB) IS
BEGIN
  SELECT T_SLE_OBJ(SLE_NO, SLE_DT, SLE_HMS, SHP_NO)
    BULK COLLECT INTO o_list
    FROM CF10
   WHERE SLE_DT BETWEEN p_fr AND p_to
   ORDER BY SLE_DT DESC, SLE_NO DESC;
END;

실행계획 학습용 예시 ​

xplan
[프로시저 안 SQL: DISPLAY_CURSOR (ALLSTATS LAST) · 2023년]
---------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |    249K|00:00:01.38 |    4583 |          |
|   1 |  SORT ORDER BY     |      |      1 |    250K|    249K|00:00:01.38 |    4583 |   17M (0)|
|*  2 |   TABLE ACCESS FULL| CF10 |      1 |    250K|    249K|00:00:00.09 |    4583 |          |
---------------------------------------------------------------------------------------------------
   2 - filter(("SLE_DT">=:B2 AND "SLE_DT"<=:B1))

[화면 한 번 · 2023년]
  프로시저 실행                    1.9 초 (SQL 1.38 초 + 컬렉션 채우기)
  OUT 컬렉션 전송과 Java 변환      5.9 초 · bytes sent via SQL*Net to client 21.4 MB
  session pga memory max           96 MB
  화면에 보인 행                   50

문제 ​

  1. 첫 페이지 50건을 보여 주려고 서버와 화면이 한 일을 위 숫자로 설명하시오.
  2. 화면이 첫 페이지를 바로 띄우도록 프로시저를 고치시오. 화면(Java) 쪽에서 지켜야 할 것도 쓰시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자