From 49683b780025ebe110116ab0aeb2f7f008f96257 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 27 Aug 2026 15:41:27 +0500 Subject: [PATCH] =?UTF-8?q?feat(tradein/db):=20=D0=B4=D1=80=D0=BE=D0=BF=20?= =?UTF-8?q?=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=20listings=5Fgeom=5Fidx=20=E2=80=94=20geography-?= =?UTF-8?q?=D0=B4=D0=B2=D0=BE=D0=B9=D0=BD=D0=B8=D0=BA=20=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D1=91=D1=82=20=D0=B2=D1=81=D1=8E=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=83=20(#2997)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Критерий (размечен 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 --- .../data/sql/273_drop_listings_geom_idx.sql | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tradein-mvp/backend/data/sql/273_drop_listings_geom_idx.sql 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; -- 2.45.3