테마
한빛유통은 2023년부터 새 쿠폰에 12자리 번호를 붙인다. 쿠폰 테이블은 그 전 프로모션 시스템에서 옮겨 온 것이라 번호 컬럼이 CHAR(16)이다. 새 결제 앱을 내놓은 날, 12자리 쿠폰이 전부 「없는 쿠폰」으로 나왔다. 그런데 SQL Developer에서 WHERE CPN_NO = 'K7Q2M9X4P1R8'로 치면 쿠폰이 나온다.
조민우가 급히 조건을 TRIM(CPN_NO) = :v_cpn_no로 바꿔 장애를 닫았다. 그 뒤로 결제 한 건이 쿠폰을 확인할 때마다 0.1초 가까이 걸린다. 결제는 하루 3만 건이다.
T_CPN 발급 쿠폰(이 문제에서 쓰는 파생 테이블, 구 프로모션 시스템에서 이관): 800,000행 · 6,020블록 · CPN_NO CHAR(16) · CUS_ID · ISU_DT · EXP_DT · USE_YN · DC_AMTCPN_NO는 구 번호 16자리 420,000건과 2023년 이후 12자리 380,000건이다. 12자리 번호는 CHAR라서 뒤에 공백 4칸이 채워져 저장된다PK_T_CPN (CPN_NO): BLEVEL 2 · 리프 약 3,330블록 · 통계 최신-- [장애 때] WHERE CPN_NO = :v_cpn_no → 12자리 쿠폰이 0건
-- [핫픽스] 조민우
SELECT CPN_NO, CUS_ID, EXP_DT, USE_YN, DC_AMT
FROM T_CPN
WHERE TRIM(CPN_NO) = :v_cpn_no
[장애 때 · CPN_NO = :v_cpn_no · 'K7Q2M9X4P1R8']
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | 3 |
| 1 | TABLE ACCESS BY INDEX ROWID| T_CPN | 1 | 1 | 0 |00:00:00.01 | 3 |
|* 2 | INDEX UNIQUE SCAN | PK_T_CPN | 1 | 1 | 0 |00:00:00.01 | 3 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CPN_NO"=:V_CPN_NO)
[핫픽스 · TRIM(CPN_NO) = :v_cpn_no · 같은 번호]
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.09 | 6024 |
|* 1 | TABLE ACCESS FULL | T_CPN | 1 | 8000 | 1 |00:00:00.09 | 6024 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TRIM("CPN_NO")=:V_CPN_NO)