테마
고객센터 화면 맨 위의 「미완료 주문」 배지는 완료되지 않은 주문 수를 보여 준다. 상담원 PC 40대가 10초마다 이 숫자를 새로 센다.
처음 판은 NOT IN ('COMPLETE')였다. 느리다는 말이 나오자 조민우는 어디선가 들은 말("부정형은 인덱스를 못 탄다")을 따라 긍정형으로 바꿨다. 그러면서 "혹시 상태가 빈 주문이 있으면 빠질까 봐" 하며 OR ORD_ST IS NULL도 붙였다. 그랬더니 더 느려졌다.
T_ORD_BIG: 1,000,000행 · 5,826블록 · ORD_ST COMPLETE 900,000 · PENDING 80,000 · CANCEL 20,000 · NULL 0건(NOT NULL 제약은 없다) · 상태값은 지금 이 셋뿐이다IX_ORD_BIG_ST (ORD_ST): BLEVEL 2 · 리프 2,775블록 · 통계 최신 · ORD_ST에 히스토그램(FREQUENCY)-- [처음 판]
SELECT COUNT(*) FROM T_ORD_BIG WHERE ORD_ST NOT IN ('COMPLETE');
-- [조민우의 수정안]
SELECT COUNT(*) FROM T_ORD_BIG
WHERE ORD_ST = 'PENDING' OR ORD_ST = 'CANCEL' OR ORD_ST IS NULL;
[처음 판 — NOT IN]
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.04 | 2791 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.04 | 2791 |
|* 2 | INDEX FAST FULL SCAN| IX_ORD_BIG_ST | 1 | 100K| 100K|00:00:00.04 | 2791 |
-----------------------------------------------------------------------------------------------
2 - filter("ORD_ST"<>'COMPLETE')
[조민우의 수정안 — 긍정형 + OR IS NULL]
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.06 | 5826 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.06 | 5826 |
|* 2 | TABLE ACCESS FULL| T_ORD_BIG | 1 | 100K| 100K|00:00:00.06 | 5826 |
-------------------------------------------------------------------------------------------
2 - filter(("ORD_ST"='PENDING' OR "ORD_ST"='CANCEL' OR "ORD_ST" IS NULL))