-- Контекст: индекс дефицита #1959 (эпик #1953) — «−1.00 везде». -- -- Прогнозный движок дефицита (compute_demand_supply_forecast) дедуплицирует -- objective_lots до ПОСЛЕДНЕГО снапшота на каждый ФИЗИЧЕСКИЙ лот -- (objective_lots — append-per-snapshot, ~2.9× инфляция строк; без дедупа спрос И -- предложение оба раздуты симметрично → каждая ячейка what_to_build даёт один и тот -- же ratio → все deficit_index = −1.0). Дедуп делается через -- SELECT DISTINCT ON (project_name, corpus_name, section, floor, lot_number) … -- ORDER BY project_name, corpus_name, section, floor, lot_number, -- snapshot_date DESC, id DESC -- по квартирам (premise_kind='квартира'). Этот partial index точно совпадает с -- ключом DISTINCT ON и его направлениями сортировки → планировщик берёт Index-Only -- Scan + Unique вместо сортировки 1.75M строк (EXPLAIN на prod: Sort исчезает, -- cost ≈ 122k вместо полной сортировки). -- -- DESC на snapshot_date/id — чтобы «последний снапшот первым» читался прямо из -- индекса (DISTINCT ON берёт первую строку каждой группы). premise_kind в WHERE — -- partial index только по квартирам (единственный сегмент дефицит-расчёта), меньше -- и плотнее, чем полный. -- -- Порядок применения: миграция ПЕРВОЙ (deploy first), затем backend-код, который -- использует DISTINCT ON. Idempotent (CREATE INDEX IF NOT EXISTS) — безопасно при -- ре-apply. Self-wrapped BEGIN/COMMIT. BEGIN; CREATE INDEX IF NOT EXISTS objective_lots_physflat_latest_idx ON objective_lots ( project_name, corpus_name, section, floor, lot_number, snapshot_date DESC, id DESC ) WHERE premise_kind = 'квартира'; COMMIT;