Оба места утверждали, что у Домклика один выделенный резидентный прокси и пула нет. Это перестало быть правдой ещё в #2800 (миграция 253 сняла резервацию узла), но текст остался — и именно на него опирался тикет #3189, поставленный под «калибровку» ограничения, которого не существует. Свип к тому же ходит через пул давно (serp.py:359), а бэкфилл подключён к нему в PR #3222. Заодно докстринг называл не тот ограничитель: свип кладёт не счётчик провалов lease, а break по первому DomClickBlockedError (#2854) — до ротации дело не доходит ни при каком счётчике, отсюда buckets_completed=0. Только комментарии, поведение не меняется. Миграция 175 уже применена, а _schema_migrations трекает по имени файла без checksum — правка текста её не перезапустит.
49 lines
3.1 KiB
SQL
49 lines
3.1 KiB
SQL
-- Индексы под горячий путь 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.';
|