diff --git a/schedules/anchoring/docs/개발용.md b/schedules/anchoring/docs/개발용.md index 82c86e1..5b8f9cd 100644 --- a/schedules/anchoring/docs/개발용.md +++ b/schedules/anchoring/docs/개발용.md @@ -335,10 +335,11 @@ ALTER TABLE negotiation.sessions ADD COLUMN IF NOT EXISTS last_offered_price BIGINT NULL, -- 마지막 제시가(가격 흔적) — 가격 입력마다 갱신, 종료 후 불변 ADD COLUMN IF NOT EXISTS anchoring_adjustment_id BIGINT NULL; -- NULL=미처리 0=제외확정 >0=소비한 조정 id --- 배치 스캔 최적화: 미처리 세션만 +-- 배치 스캔 최적화: 미처리 "재협상" 세션만 (qt_type=1 을 술어에 포함 MUST — +-- 빼면 배치가 마킹하지 않는 비재협상 세션이 영구 잔류해 인덱스가 무한 성장) CREATE INDEX IF NOT EXISTS idx_sessions_anchoring_pending - ON negotiation.sessions (qt_type, status) - WHERE anchoring_adjustment_id IS NULL AND deleted = false; + ON negotiation.sessions (status) + WHERE anchoring_adjustment_id IS NULL AND deleted = false AND qt_type = 1; ``` ### 6.3 조회용 뷰 (파생 — 상태 없음) diff --git a/schedules/anchoring/schema.sql b/schedules/anchoring/schema.sql index f203e82..af067d9 100644 --- a/schedules/anchoring/schema.sql +++ b/schedules/anchoring/schema.sql @@ -33,10 +33,12 @@ ALTER TABLE negotiation.sessions ADD COLUMN IF NOT EXISTS last_offered_price BIGINT NULL, -- 협력사 마지막 제시가(원) — 가격 입력마다 backend 가 갱신, 종료 후 불변. NULL=가격 흔적 없음(표본 제외) ADD COLUMN IF NOT EXISTS anchoring_adjustment_id BIGINT NULL; -- NULL=미처리 0=제외확정 >0=소비한 조정 id --- 배치 스캔 최적화: 미처리 세션만 (부분 인덱스) +-- 배치 스캔 최적화: 미처리 "재협상" 세션만 (부분 인덱스). +-- qt_type=1 을 술어에 포함해야 함 — 빼면 배치가 마킹하지 않는 비재협상 세션이 +-- 영구 잔류해 인덱스가 전체 세션 수에 비례해 성장한다(의도는 이월 풀만 담는 소형 인덱스). CREATE INDEX IF NOT EXISTS idx_sessions_anchoring_pending - ON negotiation.sessions (qt_type, status) - WHERE anchoring_adjustment_id IS NULL AND deleted = false; + ON negotiation.sessions (status) + WHERE anchoring_adjustment_id IS NULL AND deleted = false AND qt_type = 1; -- ============================================================ -- 조회용 뷰 (파생 — 상태 없음, 진실 원천은 rate_adjustments)