Skip to content
튜닝 연습인덱스 스캔 효율과 테이블 액세스
ACC-050

상품평 본문을 받기 시작한 뒤로 긴 상품평은 등록이 실패하고, 상품평 탭은 두 배 넘게 읽는다

중급INSERT한빛유통125 / 700

상황 ​

지난달 상품평 테이블 T_ITM_EVL을 IOT로 바꿔 상품평 탭이 3블록으로 끝나게 됐다(ACC-049). 이번 달에는 짧은 한 줄 평만 받던 EVL_DSC를 4,000바이트로 넓혀 본문을 받기 시작했고, 옛 상품평의 본문도 원본 시스템에서 옮겨 채웠다. 화면을 바꾸면서 상품평 탭 목록에서는 본문을 빼고, 한 건을 누르면 팝업으로 본문을 보여 준다. 그 뒤로 고객센터에 "긴 리뷰를 쓰면 등록 버튼을 눌러도 오류가 난다"는 문의가 하루 몇 건씩 들어오고, 본문을 읽지도 않는 상품평 탭은 3블록에서 8블록으로 늘었다.

테이블과 인덱스 ​

  • T_ITM_EVL 상품평가(IOT): 5,000행 · PK PK_T_ITM_EVL_IOT (ITM_ID, EVL_LST_NO) · BLEVEL 1 · 리프 33블록 → 본문을 채운 뒤 약 690블록 · OVERFLOW 세그먼트 없음 · PCTTHRESHOLD 기본값(50)
  • 컬럼 순서: ITM_ID · EVL_LST_NO · CUS_ID · EVL_DSC · EVL_DT · EVL_PT
  • 본문 길이: 평균 약 600바이트(한글 200자 남짓) · 4,000바이트 가까운 긴 본문이 가끔 들어온다 · 본문 말고 한 행은 약 60바이트
  • 상품 하나에 50건 · 하루 새 평가 수십 건

원본 SQL ​

sql
-- 상품평 탭 목록 (본문은 빼고)
SELECT EVL_LST_NO, CUS_ID, EVL_DT, EVL_PT
  FROM T_ITM_EVL
 WHERE ITM_ID = :v_itm
 ORDER BY EVL_LST_NO DESC;

-- 본문 팝업
SELECT EVL_DSC FROM T_ITM_EVL WHERE ITM_ID = :v_itm AND EVL_LST_NO = :v_no;

-- 상품평 등록
INSERT INTO T_ITM_EVL (ITM_ID, EVL_LST_NO, CUS_ID, EVL_DSC, EVL_DT, EVL_PT)
VALUES (:v_itm, :v_no, :v_cus, :v_dsc, SYSDATE, :v_pt);

-- 이번 달에 한 변경
ALTER TABLE T_ITM_EVL MODIFY (EVL_DSC VARCHAR2(4000));

실행계획 학습용 예시 · 본문 길이 분포와 리프 수는 어림값 ​

xplan
[상품평 탭 목록 · 본문을 채운 뒤]
-----------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name             | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                  |      1 |        |     50 |00:00:00.01 |       8 |
|*  1 |  INDEX RANGE SCAN DESCENDING  | PK_T_ITM_EVL_IOT |      1 |     50 |     50 |00:00:00.01 |       8 |
-----------------------------------------------------------------------------------------------------------
   1 - access("ITM_ID"=:V_ITM)

[등록 실패 로그 · 오늘 3건 가운데 하나]
INSERT INTO T_ITM_EVL (ITM_ID, EVL_LST_NO, CUS_ID, EVL_DSC, EVL_DT, EVL_PT) VALUES (:1, :2, :3, :4, SYSDATE, :5)
  ORA-01429: Index-Organized Table: no data segment to store overflow row-pieces
  (:4 의 길이 3,962바이트)

문제 ​

  1. 긴 상품평의 등록이 ORA-01429로 실패하는 이유와, 본문을 읽지 않는 상품평 탭이 3블록에서 8블록으로 늘어난 이유를 IOT의 리프 블록에 무엇이 담기는지로 설명하시오.
  2. IOT를 유지하면서 두 문제를 함께 고치는 DDL을 작성하시오. 고친 뒤 상품평 탭과 본문 팝업이 각각 무엇을 읽는지와 그 구조의 대가를 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자