Follow-up review #2240: best_layouts._SUPPLY_ONLY_LOTS_SQL projects
price_per_m2_rub after DISTINCT ON (physflat), but the 176-й covering
index does not carry it in INCLUDE, so Index-Only Scan is impossible and
heavy projects fall back to heap scan + external-merge Sort (~7 MB temp,
~500 ms).
Rebuild the covering index as v2 with price_per_m2_rub added to INCLUDE.
Same key + partial-WHERE as 176-й, so all prior consumers are unchanged;
supply-only now gets Index Only Scan (~54 ms, prod EXPLAIN on the two
heaviest projects).
CREATE new v2 name -> DROP old (mirrors 176-й ordering; never a window
without a covering index under DISTINCT ON). Plain CREATE INDEX in
BEGIN/COMMIT, NOT CONCURRENTLY: deploy.yml pipes each .sql whole through
psql and the file self-wraps in BEGIN/COMMIT, where CONCURRENTLY is
forbidden (same policy as 168-й/176-й). Deploy outside the weekly
objective-scrape window (~252 MB build under brief SHARE-lock on
objective_lots, ~1.9M rows). ANALYZE at end of tx.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>