feat(tradein/db): дроп дублирующего listings_geom_idx (#2997) #3130

Merged
bot-backend merged 1 commit from feat/2997-drop-listings-geom-idx into main 2026-08-27 10:47:31 +00:00
Collaborator

Датированный пункт #2997: пара gist(geom) + gist((geom::geography)) на listings, критерий дропа размечен 21.08 ДО окна наблюдений.

Критерий выполнен, окно склеено через переезд

Переезд 25.08 разорвал счётчики, поэтому окно собрано из двух половин + два независимых контроля:

источник listings_geom_idx listings_geom_geog_idx
замороженный Beget (вся история до 25.08 17:23) 4 116 сканов / 115 МБ 217 712 сканов / 212 МБ
живой Poincare (25.08 → 27.08) 0 сканов работает (24 скана, 112k tup_read)
  • прирост geom на Beget за последние 4 дня (+164) — вырожденные планы geom IS NOT NULL (bitmap без пространственного условия), тот же паттерн, который у houses устранил geog-индекс #3020;
  • EXPLAIN горячего запроса эстиматора (радиус через geography): Bitmap Index Scan on listings_geom_geog_idx — geom-индекс в плане не участвует;
  • свип кода: ни одного пространственного оператора по голому listings.geom — оба geometry-space ST_DWithin (cadastral_geo_match, estimator:1506) бьют по cadastre_buildings.geom, listings там внешняя сторона джойна.

Что даёт

115 МБ сейчас; минус одна индексная запись из ~30 на каждый из 20.86 млн не-HOT апдейтов listings; на московском объёме — кратно (#2997 оценивал ~800 МБ).

CONCURRENTLY без BEGIN по образцу 270 (lock-гейт пройден), идемпотентно, откат — CREATE INDEX CONCURRENTLY (в шапке миграции).

Приёмка после деплоя: индекс отсутствует; EXPLAIN того же запроса — план не деградировал; p95 гео-запросов эстиматора не вырос.

Остальное из #2997 (11 мёртвых индексов, пересоздание rooms_area без предиката) — отдельными решениями в рамках эпика #2989, здесь только датированный пункт.

🤖 Generated with Claude Code

Датированный пункт #2997: пара gist(geom) + gist((geom::geography)) на listings, критерий дропа размечен 21.08 ДО окна наблюдений. ## Критерий выполнен, окно склеено через переезд Переезд 25.08 разорвал счётчики, поэтому окно собрано из двух половин + два независимых контроля: | источник | listings_geom_idx | listings_geom_geog_idx | |---|---|---| | замороженный Beget (вся история до 25.08 17:23) | 4 116 сканов / 115 МБ | **217 712** сканов / 212 МБ | | живой Poincare (25.08 → 27.08) | **0 сканов** | работает (24 скана, 112k tup_read) | - прирост geom на Beget за последние 4 дня (+164) — вырожденные планы `geom IS NOT NULL` (bitmap без пространственного условия), тот же паттерн, который у houses устранил geog-индекс #3020; - **EXPLAIN** горячего запроса эстиматора (радиус через geography): `Bitmap Index Scan on listings_geom_geog_idx` — geom-индекс в плане не участвует; - **свип кода**: ни одного пространственного оператора по голому `listings.geom` — оба geometry-space `ST_DWithin` (cadastral_geo_match, estimator:1506) бьют по `cadastre_buildings.geom`, listings там внешняя сторона джойна. ## Что даёт 115 МБ сейчас; минус одна индексная запись из ~30 на каждый из 20.86 млн не-HOT апдейтов listings; на московском объёме — кратно (#2997 оценивал ~800 МБ). CONCURRENTLY без BEGIN по образцу 270 (lock-гейт пройден), идемпотентно, откат — `CREATE INDEX CONCURRENTLY` (в шапке миграции). Приёмка после деплоя: индекс отсутствует; EXPLAIN того же запроса — план не деградировал; p95 гео-запросов эстиматора не вырос. Остальное из #2997 (11 мёртвых индексов, пересоздание rooms_area без предиката) — отдельными решениями в рамках эпика #2989, здесь только датированный пункт. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bot-backend added 1 commit 2026-08-27 10:41:52 +00:00
feat(tradein/db): дроп дублирующего listings_geom_idx — geography-двойник несёт всю работу (#2997)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m45s
49683b7800
Критерий (размечен 21.08 ДО окна) выполнен, окно склеено через переезд:
замороженный Beget — 4 116 сканов против 217 712 у geog за всю историю
(прирост +164/4д — вырожденные IS NOT NULL-планы, паттерн #3020); живой
Poincare — 0 сканов за двое суток; EXPLAIN горячего пути — geog; свип кода —
ни одного пространственного оператора по голому listings.geom.

Экономия 115 МБ + минус одна индексная запись на каждый не-HOT апдейт
(их 20.86 млн). CONCURRENTLY по образцу 270, идемпотентно, откат — CREATE
INDEX CONCURRENTLY (в шапке миграции).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit 063485e0e2 into main 2026-08-27 10:47:31 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3130
No description provided.