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

080 수신거부 전화 한 통마다 연락처 60만 건을 읽고, 어떤 고객은 거부해도 문자가 계속 온다

실전UPDATE한빛유통31 / 700

상황 ​

한빛유통의 080 수신거부 ARS는 고객이 누른 휴대폰 번호로 마케팅 문자 수신 동의를 끈다. ARS 연동 모듈은 누른 숫자를 정수(long)로 바꿔 넘기고, 처리 SQL은 UPDATE 한 문장이다. 하루 3천 통쯤 들어오고 통마다 0.4초가 걸린다. 고객센터에는 "수신거부를 했는데 문자가 또 온다"는 민원이 매주 들어온다. 오과장이 어제 처리 결과를 뽑아 보니 갱신 0건으로 끝난 전화가 81통이었다.

테이블과 인덱스 ​

  • T_CUS_CTC 고객 연락처(이 문제에서 쓰는 파생 테이블, 2023년 회원 통합 때 신 회원과 구 회원의 연락처를 합쳤다): 600,000행 · 3,760블록 · CTC_SEQ(PK) · CUS_ID · MBL_NO VARCHAR2(20) · SMS_AGR_YN · UPD_DT
  • MBL_NO는 신 회원 570,000건이 '01012345678' 모양(11자리)이고, 구 회원 이관분 30,000건은 '+821012345678' 모양(국가 번호)이다. 하이픈이 든 값은 지금은 없다
  • 인덱스 PK_T_CUS_CTC (CTC_SEQ) · IX_CUS_CTC_MBL (MBL_NO): BLEVEL 2 · 리프 약 1,880블록 · 통계 최신
  • 회원 가입과 정보 수정 화면이 하루 약 4천 건의 연락처를 넣거나 고친다

원본 SQL ​

sql
-- ARS 연동 : ps.setLong(1, 1012345678L)   ← 고객이 누른 01012345678
UPDATE T_CUS_CTC
   SET SMS_AGR_YN = 'N', UPD_DT = SYSDATE
 WHERE MBL_NO = :1

실행계획 학습용 예시 ​

xplan
[고객이 01012345678을 눌렀을 때]
--------------------------------------------------------------------------------------------
| Id  | Operation          | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |                |      1 |        |      0 |00:00:00.38 |    3768 |
|   1 |  UPDATE            | T_CUS_CTC      |      1 |        |      0 |00:00:00.38 |    3768 |
|*  2 |   TABLE ACCESS FULL| T_CUS_CTC      |      1 |   6000 |      2 |00:00:00.38 |    3762 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TO_NUMBER("MBL_NO")=:1)

[V$SQL_BIND_CAPTURE]   :1   NUMBER   1012345678

[어제 처리 결과 · 3,012통]
  갱신 1건 이상   2,931통
  갱신 0건           81통   ← 79통은 연락처가 '+8210…' 모양인 구 회원, 2통은 등록되지 않은 번호

문제 ​

  1. 2번 줄의 TO_NUMBER가 어디서 왔는지, 그리고 구 회원의 수신거부가 갱신 0건으로 끝난 이유를 설명하시오.
  2. ① SQL에서 바인드 쪽을 TO_CHAR(:1)로 바꾸는 방법, ② TO_NUMBER(MBL_NO) 함수 기반 인덱스를 만드는 방법, ③ ARS가 누른 번호를 그대로 문자열로 넘기고 저장 형식을 하나로 통일하는 방법을 비교하시오.
  3. 채택한 방법을 SQL과 DDL로 작성하고, 반영 순서와 부작용, 재발 방지책을 설명하시오.
원본 SQL을 고쳐 쓰세요. 인덱스 DDL과 힌트도 쓸 수 있습니다.
무엇이 문제였고 왜 이렇게 고쳤는지 쓰세요.0자