acquire-core-x/db/schema.d/99c-bulk-index.sql
hyeongwoo ab7983318d Wave I: 대량·다양 데이터 (다년치 135만 매입 → 총 1,130만 행)
기존 3개월치(~20만행)를 5.5년치 대량 히스토리로 확대. 성장추세·계절성·
가맹점 생애주기 반영. ID 오프셋 대역(1천만+)으로 기존/라이브 채번과 비충돌,
전부 idempotent 가드.

- 98-bulk-seed.sql: 가맹점 40→200(MCC·요율·개점일·CLOSED/HOLD 다양) +
  매입 135만건(2021-01~2026-04, 성장추세 연 0.5→1.4배·12월 계절피크·주중주말·
  다양 채널/발급사/카드종류/금액구간). 27초.
- 99-bulk-derive.sql: 승인 135만·원장 2.6M(RECON+SETTLE)·정산 1.29M·
  가맹점집계 358k. 시퀀스 정렬. 31초.
- 99b-bulk-econ.sql: 정산경제 파생 — 수수료3층분해 1.29M·프레젠트먼트 1.29M·
  ISO8583 클리어링 1.29M·순액정산(발급사×일) 16k·펀딩 355k.
- 99c-bulk-index.sql: 운영 인덱스 14개(biz_date/merchant/status 등) + ANALYZE.

검증 (실측)
- 총 1,130만 행, DB 1.8GB. 연도별 성장 2021년 14.5만→2025년 35.3만건.
- 3층 항등식 1,293,145/1,293,145, 펀딩 항등식 355,284/355,284 (100% 성립).
- 대시보드/정산경제 화면 정상: 활성가맹점 191, 총매입 3,997억, 입금률 95.7%.
- 집계쿼리 0.5초(인덱스). 최근 3개월 라이브 데이터 무손상.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 12:24:42 +09:00

20 lines
1.5 KiB
SQL

-- ===========================================================================
-- 99c-bulk-index.sql : 대량 데이터 운영 인덱스. 화면/조회 쿼리 응답성 확보.
-- (실운영 매입시스템의 상시 인덱스에 해당) 전부 IF NOT EXISTS (idempotent).
-- ===========================================================================
CREATE INDEX IF NOT EXISTS ix_purchase_bizdate ON purchase(biz_date);
CREATE INDEX IF NOT EXISTS ix_purchase_merch ON purchase(merchant_id);
CREATE INDEX IF NOT EXISTS ix_purchase_status ON purchase(status);
CREATE INDEX IF NOT EXISTS ix_purchase_merch_day ON purchase(merchant_id, biz_date);
CREATE INDEX IF NOT EXISTS ix_settlement_bizdate ON settlement(biz_date);
CREATE INDEX IF NOT EXISTS ix_settlement_merch ON settlement(merchant_id);
CREATE INDEX IF NOT EXISTS ix_ledger_bizdate ON ledger(biz_date);
CREATE INDEX IF NOT EXISTS ix_ledger_pid ON ledger(purchase_id);
CREATE INDEX IF NOT EXISTS ix_cmlog_bizdate ON cm_log(biz_date);
CREATE INDEX IF NOT EXISTS ix_cmlog_level ON cm_log(log_level);
CREATE INDEX IF NOT EXISTS ix_funding_merch ON st_merchant_funding(merchant_id);
CREATE INDEX IF NOT EXISTS ix_netset_bizdate ON st_net_settlement(biz_date);
CREATE INDEX IF NOT EXISTS ix_clearing_bizdate ON mg_clearing(biz_date);
CREATE INDEX IF NOT EXISTS ix_mercsum_day ON merchant_summary(biz_date);
ANALYZE purchase; ANALYZE settlement; ANALYZE ledger; ANALYZE st_fee_component;
ANALYZE st_merchant_funding; ANALYZE mg_clearing;