perf(tradein): GIST index on (geom::geography) for estimator radius filter (#1189) (#1924)
Some checks failed
Deploy Trade-In / changes (push) Successful in 10s
Deploy Trade-In / build-browser (push) Has been skipped
Deploy Trade-In / build-backend (push) Has been skipped
Deploy Trade-In / deploy (push) Has been skipped
Deploy Trade-In / build-frontend (push) Successful in 31s
Deploy Trade-In / test (push) Failing after 1m25s
Some checks failed
Deploy Trade-In / changes (push) Successful in 10s
Deploy Trade-In / build-browser (push) Has been skipped
Deploy Trade-In / build-backend (push) Has been skipped
Deploy Trade-In / deploy (push) Has been skipped
Deploy Trade-In / build-frontend (push) Successful in 31s
Deploy Trade-In / test (push) Failing after 1m25s
This commit is contained in:
parent
d111573a4b
commit
d89210200b
1 changed files with 42 additions and 0 deletions
|
|
@ -0,0 +1,42 @@
|
||||||
|
-- 134_listings_geom_geography_gist.sql
|
||||||
|
-- GIST expression-индекс на (geom::geography) — ускоряет radius-фильтр эстиматора.
|
||||||
|
--
|
||||||
|
-- WHY (#1189 — EXPLAIN-решение об индексе):
|
||||||
|
-- Эстиматор тянет аналоги через `ST_DWithin(geom::geography, point, radius)`
|
||||||
|
-- (Tier W/H/S radius-путь). Существующий `listings_geom_idx` = `gist(geom)` —
|
||||||
|
-- на geometry, а предикат кастует в geography, поэтому планировщик НЕ может
|
||||||
|
-- использовать его для пространственного условия: ST_DWithin падает в Filter, а
|
||||||
|
-- geom-индекс отрабатывает только `geom IS NOT NULL` (скан ~54.5k строк).
|
||||||
|
-- Прод-EXPLAIN (2026-06-26, ЕКБ-точка r=1500, 2-комн 45-65м²):
|
||||||
|
-- было — BitmapAnd(geom IS NOT NULL=54531) + Filter ST_DWithin → 180 мс, read 3961.
|
||||||
|
-- стало — Index Scan по (geom::geography) && _st_expand(point,1500) → ~38 мс
|
||||||
|
-- (~4.7× быстрее, тронуто ~5k строк вместо 54.5k). Замерено dry-run'ом
|
||||||
|
-- (BEGIN; CREATE INDEX; EXPLAIN ANALYZE; ROLLBACK) на реальном проде.
|
||||||
|
--
|
||||||
|
-- WHAT:
|
||||||
|
-- GIST-индекс по выражению (geom::geography). Согласован с тем, как эстиматор
|
||||||
|
-- уже пишет предикат — без правок кода: тот же `ST_DWithin(geom::geography, ...)`
|
||||||
|
-- начинает использовать индекс как Index Cond.
|
||||||
|
--
|
||||||
|
-- SAFETY:
|
||||||
|
-- - НЕ деструктивно: только добавление индекса, данные не трогаются.
|
||||||
|
-- - IF NOT EXISTS → идемпотентно при повторном прогоне (no-op).
|
||||||
|
-- - Сборка GIST по ~54.5k non-null geom строк — быстро (~1-2с), кратковременный
|
||||||
|
-- ACCESS EXCLUSIVE lock на время сборки. CONCURRENTLY не используем: файл обёрнут
|
||||||
|
-- в BEGIN/COMMIT (CREATE INDEX CONCURRENTLY в транзакции нельзя), а на таком
|
||||||
|
-- объёме обычная сборка дёшева. NB: раннер деплоя (deploy.yml) гонит файл через
|
||||||
|
-- psql -v ON_ERROR_STOP=on БЕЗ --single-transaction, т.е. транзакцию открывает
|
||||||
|
-- сам файл — как 133/104 и house-rule (Schema_Migrations_vs_Alembic.md #4).
|
||||||
|
-- - listings_geom_idx (gist(geom)) ОСТАВЛЯЕМ — он нужен другим geometry-путям.
|
||||||
|
--
|
||||||
|
-- DEPENDENCIES:
|
||||||
|
-- - listings.geom geometry(Point,4326) -- 011_listings_alter.sql / PostGIS
|
||||||
|
--
|
||||||
|
-- Deploy order: after 133_listings_uq_source_source_id.sql.
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS listings_geom_geog_idx
|
||||||
|
ON listings USING gist ((geom::geography));
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
Loading…
Add table
Reference in a new issue