fix(objective): physflat-dedup objective_lots — view + inline (request-path) + n_sold window-fix (#1964) #2032
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2032
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/objective-lots-dedup-1964"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Закрывает #1964 (эпик #1953). deep-review базы ✅ + code-review дельты ✅. Прод-verified.
Корень (переаттрибуция)
objective_lotsНЕ append-per-snapshot (lot_id UNIQUE, 5 snapshot_dates) — Objective даёт несколько lot_id одной физ-квартире (ре-листинги) → 2.91× (1.75M строк / 603k физ-квартир). История — отдельнаяobjective_lots_history(не тронута). #1959 уже дедупнул горячий forecast-путь (compute_market_metrics+ 9 консьюмеров) — не дублировал.Что
v_objective_lots_latest(DISTINCT ONфиз-ключа, latest snapshot). Прод: 603k vs 1.75M, колонки 51==51.supply_layers._L1_OPEN_SQL(главный — 3× over-count в дефицит-прогноз),competitors._SOLD_COUNT_SQL,special_indices(в /forecast background-таске), admin, landing.DISTINCT ON(фильтр пушится в CTE) — 4 request-path консьюмера вanalyze_parcel(concepts median, parcels district price + geo-median + obj_pricing). Почему не view: view выбираетol.*→ Index-Only-Unique невозможен, планировщик игнорит full-индекс (142МБ write-amp за ноль выгоды, доказано EXPLAIN); inline пушит district/geo/project-фильтр на существующие индексы. EXPLAIN: 5854мс (view) → 122-1640мс (inline), те же дедуп-значения.report_assembler._deal_count=n_sold(cumulative all-time ~380k) →round(unit_velocity × window_months)(windowed ~24.9k EKB/6мес) → честный лейбл «за 6 мес» + рабочий gate (high≥50).Безопасность / blast-radius
COUNT(DISTINCT lot_id)(fan-out safety), admin rawlots+новоеlots_physflat(ETL-fidelity). Истории/лоадера не трогаем.:name::type; 965 passed (+5 guard-тестов: view/inline-пушдаун, n_sold windowed). Без OpenAPI-изменений.Closes #1964.