gendesign/_wt-cadval/data/sql/66_indexes_recommend.sql
bot-backend 542ff1c9ca docs(tradein/domclick): два комментария описывали пул, которого нет с миграции 253
Оба места утверждали, что у Домклика один выделенный резидентный прокси и
пула нет. Это перестало быть правдой ещё в #2800 (миграция 253 сняла
резервацию узла), но текст остался — и именно на него опирался тикет #3189,
поставленный под «калибровку» ограничения, которого не существует.
Свип к тому же ходит через пул давно (serp.py:359), а бэкфилл подключён к
нему в PR #3222.

Заодно докстринг называл не тот ограничитель: свип кладёт не счётчик
провалов lease, а break по первому DomClickBlockedError (#2854) — до
ротации дело не доходит ни при каком счётчике, отсюда buckets_completed=0.

Только комментарии, поведение не меняется. Миграция 175 уже применена, а
_schema_migrations трекает по имени файла без checksum — правка текста
её не перезапустит.
2026-08-29 18:57:25 +03:00

49 lines
3.1 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Индексы под горячий путь recommend_mix (analytics_queries.py:recommend_mix).
--
-- Без них типичный POST /analytics/recommend/mix делает 3-5 seq-scan'ов на
-- 5М-строчных таблицах и тратит 1-2 сек. Цель — <500мс.
--
-- Идемпотентно через CREATE INDEX IF NOT EXISTS.
-- CONCURRENTLY НЕ используется (psql сессия с несколькими операциями) —
-- если будет блок-issue в проде, применять каждый CREATE отдельно.
-- 1) sale_graph: JOIN obj_id × type='apartments' × report_month
-- Используется в _elasticity_coef и _elasticity_per_bucket_coef.
-- Текущие индексы: (obj_id, snapshot_date), (report_month, type) — но не
-- покрывают composite seek по obj_id + type + report_month range.
CREATE INDEX IF NOT EXISTS sg_obj_type_month_idx
ON domrf_kn_sale_graph (obj_id, type, report_month DESC);
-- 2) Active competitors lookup: (district_name, obj_class, site_status)
-- Используется в _active_competitors_count, который вызывается до 3 раз
-- (каскадный fallback district+class → district → region) на каждый запрос.
-- Partial index по site_status='Строящиеся' — это то, что мы реально ищем.
CREATE INDEX IF NOT EXISTS obj_district_class_active_idx
ON domrf_kn_objects (district_name, obj_class, region_cd)
WHERE site_status = 'Строящиеся';
-- 3) Per-bucket flats lookup: (obj_id, total_area)
-- Используется в _elasticity_per_bucket_coef для группировки sale_graph
-- по «доминирующему bucket» каждого ЖК. Partial index по area-диапазону
-- который мы реально считаем (15..200 м²).
CREATE INDEX IF NOT EXISTS flats_obj_area_idx
ON domrf_kn_flats (obj_id, total_area)
WHERE total_area BETWEEN 15 AND 200;
-- 4) Cadastre baseline: (cost_value, area) — partial для строений
-- с заполненными ценой и площадью. Используется в _district_cadastre_baseline
-- + view v_zk_rosreestr_velocity. Также без этого индекса при PERCENTILE_CONT
-- по cost_value/area делается seq-scan на 10K строк × spatial-join.
CREATE INDEX IF NOT EXISTS buildings_cost_area_idx
ON cad_buildings (cost_value, area)
WHERE cost_value IS NOT NULL AND area IS NOT NULL;
-- Комментарии для будущей навигации.
COMMENT ON INDEX sg_obj_type_month_idx IS
'Hot path: JOIN domrf_kn_sale_graph по obj_id+type для regression в _elasticity_*.';
COMMENT ON INDEX obj_district_class_active_idx IS
'Hot path: _active_competitors_count + recommend_mix scope queries (Partial: site_status=Строящиеся).';
COMMENT ON INDEX flats_obj_area_idx IS
'Hot path: per-bucket median total_area для _elasticity_per_bucket_coef.';
COMMENT ON INDEX buildings_cost_area_idx IS
'Hot path: cadastre median ₽/м² в _district_cadastre_baseline.';