diff --git a/tradein-mvp/backend/data/sql/273_drop_listings_geom_idx.sql b/tradein-mvp/backend/data/sql/273_drop_listings_geom_idx.sql new file mode 100644 index 00000000..fcad059b --- /dev/null +++ b/tradein-mvp/backend/data/sql/273_drop_listings_geom_idx.sql @@ -0,0 +1,26 @@ +-- 273_drop_listings_geom_idx.sql +-- #2997: снять дублирующий geometry-индекс listings — geography-двойник несёт всю работу. +-- +-- Критерий дропа (размечен 21.08, датирован окном до 28.08) выполнен с запасом, +-- окно склеено из двух половин (переезд 25.08 разорвал счётчики): +-- * замороженная база Beget (вся история до 25.08 17:23): +-- listings_geom_idx 4 116 сканов / 115 МБ +-- listings_geom_geog_idx 217 712 сканов / 212 МБ (53×) +-- прирост geom за последние 4 дня Beget (+164) — вырожденные планы +-- `geom IS NOT NULL` (bitmap без пространственного условия), тот же паттерн, +-- который у houses устранил geog-индекс #3020; +-- * живая база Poincare (25.08→27.08): geom — 0 сканов, geog — работает; +-- * EXPLAIN горячего запроса эстиматора (радиус через geography) — идёт по +-- listings_geom_geog_idx, geom-индекс в плане не участвует; +-- * свип кода: ни одного пространственного оператора по голому listings.geom +-- (оба ST_DWithin в geometry-space бьют по cadastre_buildings.geom, +-- listings там внешняя сторона). +-- +-- Экономия: 115 МБ + минус одна индексная запись на каждый из 20.86 млн +-- не-HOT апдейтов listings; на московском объёме — кратно больше (#2997). +-- +-- CONCURRENTLY и без BEGIN — по образцу 270: раннер исполняет по операторам, +-- CONCURRENTLY нельзя в транзакции, lock-гейт эту форму не требует прикрывать. +-- Идемпотентно (IF EXISTS). Восстановление при неожиданном регрессе планов: +-- CREATE INDEX CONCURRENTLY listings_geom_idx ON listings USING GIST (geom); +DROP INDEX CONCURRENTLY IF EXISTS listings_geom_idx;