테마
이 문제는 교재 18화 졸업 과제와 같은 이커머스 데이터베이스를 씁니다. 『튜너의 1년』을 순서대로 읽고 있다면 졸업 과제를 먼저 풀고 오세요. 아래 「테이블과 인덱스」 칸에 과제의 답 일부(제약 조건, 인덱스, 통계의 실제 상태)가 나옵니다.
신규 이커머스의 로그인과 비밀번호 찾기 API는 이메일로 고객을 찾는다. 가입 화면이 입력한 대소문자를 그대로 저장해 와서, 개발팀은 대소문자를 무시하려고 양쪽을 LOWER로 감쌌다. 하루 약 30만 번 호출된다.
지난주 개발자 한 명이 "함수 인덱스를 만들면 된다더라"라며 UPPER(email) 인덱스를 만들었는데 계획은 그대로다.
customers: 5,230행 · 51블록 · email VARCHAR2 · 유니크 제약 UQ_CUSTOMERS_EMAIL (email)Kim.J@…와 kim.j@… 같은 경우)PK_CUSTOMERS (customer_id) · UQ_CUSTOMERS_EMAIL (email) · IX_CUS_EMAIL_UP (UPPER(email)): 지난주 생성 · 통계 최신SELECT customer_id, name, grade
FROM customers
WHERE LOWER(email) = LOWER(:email)
------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 51 |
|* 1 | TABLE ACCESS FULL| CUSTOMERS | 1 | 52 | 1 |00:00:00.01 | 51 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(LOWER("EMAIL")=LOWER(:EMAIL))
UPPER(email) 함수 기반 인덱스가 다 있는데도 테이블 전체를 읽는 이유를 설명하시오.