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

인덱스를 새로 만들었는데 취소 추이 그래프는 여전히 무겁다

기초DDL한빛유통76 / 700

상황 ​

정산 대시보드의 「취소 추이」는 기간을 고르면 일자별 취소 건수를 그래프로 그린다. 보통 한 분기를 고르며, 하루에 수천 번 조회된다. 지난달 조민우가 인덱스를 하나 만들면서 이런 메모를 남겼다. "종류가 많은 컬럼을 앞에 둔다. ORD_DT 1,095종, ORD_ST 3종." 인덱스는 타는데 생각만큼 빨라지지 않았다고 한다. 아래는 2024년 2분기(4 ~ 6월)를 골랐을 때다.

테이블과 인덱스 ​

  • T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_DT 1,095일(하루 913건, 전부 자정) · ORD_ST COMPLETE 90% · PENDING 8% · CANCEL 2%
  • 2024년 2분기: 83,083건 · 그중 CANCEL 1,644건(취소가 있는 날은 18일)
  • 인덱스 IX_ORD_BIG_DT_ST (ORD_DT, ORD_ST): BLEVEL 2 · 리프 약 3,890블록 · 통계 최신 · ORD_ST에 히스토그램

원본 SQL ​

sql
SELECT ORD_DT, COUNT(*) AS cancel_cnt
  FROM T_ORD_BIG
 WHERE ORD_ST = 'CANCEL'
   AND ORD_DT >= TO_DATE(:v_from, 'YYYYMMDD')
   AND ORD_DT <  TO_DATE(:v_to, 'YYYYMMDD') + 1
 GROUP BY ORD_DT
 ORDER BY ORD_DT

실행계획 학습용 예시 · 건수는 적재 스크립트 그대로 ​

xplan
---------------------------------------------------------------------------------------------------
| Id  | Operation             | Name             | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                  |      1 |        |     18 |00:00:00.02 |     326 |
|   1 |  SORT GROUP BY NOSORT |                  |      1 |     91 |     18 |00:00:00.02 |     326 |
|*  2 |   FILTER              |                  |      1 |        |   1644 |00:00:00.02 |     326 |
|*  3 |    INDEX RANGE SCAN   | IX_ORD_BIG_DT_ST |      1 |   1662 |   1644 |00:00:00.02 |     326 |
---------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TO_DATE(:V_TO,'YYYYMMDD')+1>TO_DATE(:V_FROM,'YYYYMMDD'))
   3 - access("ORD_DT">=TO_DATE(:V_FROM,'YYYYMMDD') AND "ORD_ST"='CANCEL' AND
              "ORD_DT"<TO_DATE(:V_TO,'YYYYMMDD')+1)
       filter("ORD_ST"='CANCEL')

문제 ​

  1. 인덱스를 타는데도 326블록을 읽는 이유를 Predicate Information의 3번 줄(access와 filter에 ORD_ST가 둘 다 있다)을 근거로 설명하시오.
  2. 인덱스를 다시 설계하고 DDL을 작성하시오. 조민우의 메모가 왜 틀렸는지도 한 문장으로 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자