feat(db): GiST по (geom::geography) на houses — матчинг идёт по индексу (#2997) #3020

Merged
bot-backend merged 1 commit from feat/2997-houses-geog-index into main 2026-08-21 10:24:36 +00:00

1 commit

Author SHA1 Message Date
2f7b22f659 feat(db): GiST по (geom::geography) на houses — матчинг идёт по индексу (#2997)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
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 4m15s
Почему: весь матчинг домов — ST_DWithin(geom::geography, …), а единственный
пространственный индекс houses_geom_idx построен по geometry. Планировщик
берёт его лишь как bitmap по geom IS NOT NULL и фильтрует все ~9.4k строк:
70.7 мс на запрос (EXPLAIN ANALYZE на проде 21.08), 66+5 вызовов за 13 ч по
pg_stat_statements. При росте справочника ×8.5 это главное узкое место
матчинга (#2997).

Что: миграция 270 — CREATE INDEX CONCURRENTLY houses_geog_gist_idx
USING gist ((geom::geography)); без BEGIN/COMMIT по образцу 225 (CIC не
живёт в транзакции; раннер деплоя — psql autocommit по операторам).
houses_geom_idx и дубль на listings не трогаю: в pg_stat_statements есть
живой потребитель listings.geom как geometry (сшивка с cad_buildings_local)
— дроп требует отдельного разбора.

Проверка: EXPLAIN ANALYZE до/после на проде — в комментарии к #2997.

Refs #2997
2026-08-21 15:17:50 +05:00