From 24cd74dda08318b8bc068ed18ab501f5e2fa6672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AF=BC=ED=97=8C?= Date: Thu, 2 Jul 2026 20:32:02 +0900 Subject: [PATCH] =?UTF-8?q?fix(anchoring):=20pending=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=20=EC=9D=B8=EB=8D=B1=EC=8A=A4=20=EC=88=A0=EC=96=B4=EC=97=90=20?= =?UTF-8?q?qt=5Ftype=3D1=20=EC=B6=94=EA=B0=80=20=E2=80=94=20=EB=AC=B4?= =?UTF-8?q?=ED=95=9C=20=EC=84=B1=EC=9E=A5=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB 과설정 점검에서 발견: 기존 술어(adjustment_id IS NULL AND deleted=false)로는 배치가 마킹하지 않는 비재협상 세션(재견적 등)이 인덱스에 영구 잔류해, "이월 풀만 담는 소형 인덱스" 의도와 달리 전체 세션 수에 비례해 성장하고 sessions 쓰기마다 유지 비용을 냈다. qt_type=1 을 술어에 포함해 재협상 미처리분만 남도록 수정 (키 컬럼도 status 단독으로 축소). dev DB 재생성 적용, 문서 동기화. 점검 결과 그 외 객체(테이블 1·컬럼·인덱스 1·뷰 2)는 과설정 없음으로 판정. Co-Authored-By: Claude Fable 5 --- schedules/anchoring/docs/개발용.md | 7 ++++--- schedules/anchoring/schema.sql | 8 +++++--- 2 files changed, 9 insertions(+), 6 deletions(-) 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)