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

2022년 판매를 지운 다음 날부터 가장 오래된 판매일 한 칸이 인덱스를 700블록 읽는다

중급SELECT유통139 / 700

상황 ​

본사 레거시 유통은 판매 보관 기간을 1년으로 줄이면서, 지난 토요일 밤 CF10에서 2022년 판매 250,412건을 DELETE 한 문장으로 지웠다. 월요일 아침부터 본사 「보관 현황」 화면이 굼뜨다는 말이 나왔다. 화면 맨 위 칸은 보관 중인 가장 오래된 판매일인데, 5분마다 새로 고쳐 하루 약 290번 실행된다. 조민우는 이렇게 말했다. "많이 지워서 인덱스가 망가졌다. 이참에 매주 일요일 인덱스 REBUILD 작업을 걸자."

테이블과 인덱스 ​

  • CF10 판매: 지우기 전 500,000행 · 4,583블록 · 판매 날짜순으로 쌓였다 · 지금 249,588행(2023-01-01 ~ 2023-12-31) · POS가 새 판매를 하루 약 700건 INSERT하며, 새 판매일은 늘 지금 있는 값보다 크다
  • IX_CF10_SLE_DT (SLE_DT): BLEVEL 2 · 리프 1,393블록(교재 03화 실측, 리프 한 블록에 약 359항목) · 「일별 판매 목록」(하루 706건에 18블록)도 이 인덱스를 쓴다
  • 지운 2022년 판매의 항목은 IX_CF10_SLE_DT의 왼쪽 리프 약 697블록을 채우고 있었다 · CF10_PK (SLE_NO)도 SLE_NO가 판매일로 시작하므로 왼쪽 절반이 같은 모양이다
  • 테이블스페이스는 ASSM이고, 인덱스는 모두 LOGGING이다

원본 SQL ​

sql
SELECT MIN(SLE_DT) AS old_dt
  FROM CF10

실행계획 학습용 예시 · 인덱스 규모는 교재 03화 실측 ​

xplan
[지우기 전 · 지난 금요일]
-----------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                |      1 |        |      1 |00:00:00.01 |       3 |
|   1 |  SORT AGGREGATE            |                |      1 |      1 |      1 |00:00:00.01 |       3 |
|   2 |   INDEX FULL SCAN (MIN/MAX)| IX_CF10_SLE_DT |      1 |      1 |      1 |00:00:00.01 |       3 |
-----------------------------------------------------------------------------------------------------

[지운 뒤 · 월요일]
-----------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |                |      1 |        |      1 |00:00:00.03 |     700 |
|   1 |  SORT AGGREGATE            |                |      1 |      1 |      1 |00:00:00.03 |     700 |
|   2 |   INDEX FULL SCAN (MIN/MAX)| IX_CF10_SLE_DT |      1 |      1 |      1 |00:00:00.03 |     700 |
-----------------------------------------------------------------------------------------------------

[같은 월요일 「일별 판매 목록」 2023-12-15 · IX_CF10_SLE_DT 범위 스캔]  Buffers 18 (지우기 전과 같다)

[일요일에 뜬 복사본에서 ANALYZE INDEX IX_CF10_SLE_DT VALIDATE STRUCTURE → INDEX_STATS]
  HEIGHT 3 · LF_BLKS 1,393 · LF_ROWS 500,000 · DEL_LF_ROWS 250,412

문제 ​

  1. 행은 절반으로 줄었는데 가장 오래된 판매일 한 칸이 3블록에서 700블록이 된 이유를 INDEX FULL SCAN (MIN/MAX)이 리프를 읽는 순서와 INDEX_STATS로 설명하시오. 같은 인덱스를 쓰는 「일별 판매 목록」은 왜 그대로인지도 설명하시오.
  2. 이 인덱스를 고치는 SQL을 작성하시오. COALESCE, SHRINK SPACE, REBUILD가 각각 무엇을 하고 무엇이 다른지 쓰시오.
  3. 조민우의 제안(매주 REBUILD)을 받아들일지 판단하시오. 그냥 두면 어떻게 되는지도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자