Skip to content
튜닝 연습인덱스 사용 조건
IDX-041

판매번호 규칙에서 벗어난 판매 37건을 찾는 점검이 10분마다 판매 50만 건을 다 읽는다

중급SELECT유통41 / 700

상황 ​

유통 본사 정보보안팀의 「판매번호 이상 점검」은 판매번호가 판매일자로 시작하지 않는 판매를 찾는다. 관제 모니터에서 10분마다 돈다. 지난주에는 매장 POS 한 대의 시계가 초기화되어 '1970년' 판매가 찍혔고, 개점 리허설을 하던 교육용 단말의 판매도 섞여 들어왔다. 조민우는 부정형을 없애려고 조건을 SLE_NO > '21'로 바꿔 보았다. 빨라졌지만 지난주의 1970년 판매 23건이 결과에서 사라졌다.

테이블과 인덱스 ​

  • CF10 판매: 500,000행 · 4,583블록(전체 스캔 4,510) · SLE_NO VARCHAR2(15) NOT NULL · 정상 판매번호는 '20230601-0001'처럼 판매일자 8자리로 시작한다
  • 규칙에서 벗어난 판매 37건: POS 시계 초기화로 찍힌 '19700101-0001' ~ '19700101-0023' 23건, 교육용 단말의 'TR01-0001' ~ 'TR01-0014' 14건 (문제 설정: 교재의 CF10에는 이런 행이 없다)
  • 인덱스 CF10_PK (SLE_NO): BLEVEL 2 · 리프 약 1,680 · 통계 최신 · 세션의 문자 비교는 BINARY(NLS_COMP, NLS_SORT 기본값)

원본 SQL ​

sql
SELECT SHP_NO, SLE_NO, SLE_DT, SLE_HMS, SLE_DOW
  FROM CF10
 WHERE SLE_NO NOT LIKE '20%'
 ORDER BY SHP_NO, SLE_NO

실행계획 학습용 예시 ​

xplan
-------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        |     37 |00:00:00.05 |    4510 |
|   1 |  SORT ORDER BY     |      |      1 |   5000 |     37 |00:00:00.05 |    4510 |
|*  2 |   TABLE ACCESS FULL| CF10 |      1 |   5000 |     37 |00:00:00.05 |    4510 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter("SLE_NO" NOT LIKE '20%')

문제 ​

  1. 부정형 NOT LIKE가 인덱스 범위를 정하지 못하는 이유를 설명하고, 조민우의 SLE_NO > '21'이 23건을 놓친 이유를 문자 정렬 순서로 설명하시오.
  2. 결과가 바뀌지 않게 SQL을 고쳐 CF10_PK의 범위만 읽도록 하시오. 고친 조건이 원래 조건과 같은 행을 고른다는 근거도 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자