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

매장 일별 영수증 목록의 순번이 1이 아니라 38만부터 찍히고, 화면도 느리다

기초DDL유통281 / 700

상황 ​

본사 레거시의 「매장 일별 영수증 목록」은 매장과 날짜를 고르면 그날 영수증을 시간순으로 보여 주고, 맨 앞 칸에 순번을 찍는다. 점장 여섯 명과 영업팀이 하루 2,000번쯤 연다. 명동점 점장이 문의를 보냈다. "순번이 1부터가 아니라 384,207부터 시작하고, 번호가 중간중간 건너뛴다." 화면도 한 번에 0.1초씩 걸린다. 순번은 목록 화면들이 함께 쓰는 공통 뷰 V_SLE_LIST에서 만든다.

테이블과 인덱스 ​

  • CF10 판매(영수증): 500,000행 · 4,583블록 · SLE_DT VARCHAR2(8) · 판매일자 순으로 쌓여 있어 하루치(약 700건)가 7블록 안팎에 모여 있다 · 매장 6곳
  • 인덱스 CF10_PK (SLE_NO) · IX_CF10_SLE_DT (SLE_DT): 리프 1,393블록 · 높이 3
  • 2023-06-01 영수증 706건, 그중 명동점(SHP_NO 1003) 121건 · 통계 최신

원본 SQL ​

sql
-- 공통 뷰: 목록 화면들이 순번 칸(SEQ_NO)을 여기서 가져간다
CREATE OR REPLACE VIEW V_SLE_LIST AS
SELECT ROWNUM AS SEQ_NO,
       SLE_NO, SLE_DT, SLE_HMS, SHP_NO
  FROM CF10;

-- 매장 일별 영수증 목록
SELECT SEQ_NO, SLE_NO, SLE_HMS
  FROM V_SLE_LIST
 WHERE SHP_NO = :shp
   AND SLE_DT = :dt
 ORDER BY SLE_HMS;

실행계획 학습용 예시 ​

xplan
---------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name       | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Used-Mem |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |            |      1 |        |    121 |00:00:00.11 |    4583 |          |
|   1 |  SORT ORDER BY       |            |      1 |    118 |    121 |00:00:00.11 |    4583 |13312  (0)|
|*  2 |   VIEW               | V_SLE_LIST |      1 |    118 |    121 |00:00:00.11 |    4583 |          |
|   3 |    COUNT             |            |      1 |        |    500K|00:00:00.06 |    4583 |          |
|   4 |     TABLE ACCESS FULL| CF10       |      1 |    500K|    500K|00:00:00.03 |    4583 |          |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(("SLE_DT"=:DT AND "SHP_NO"=:SHP))

[화면에 찍힌 순번 · :shp = 1003, :dt = '20230601']
  384,207 · 384,209 · 384,214 · 384,215 · … · 384,912   (121줄)

문제 ​

  1. 순번이 384,207부터 건너뛰며 찍힌 이유와, 인덱스가 있는데도 4번 줄에서 테이블 전체를 읽은 이유를 실행계획의 줄 번호로 설명하시오.
  2. 뷰 정의와 화면 SQL을 고쳐 순번이 1부터 시간순으로 찍히고 그날 영수증만 읽도록 하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자