diff --git a/tradein-mvp/backend/data/sql/267_trade_in_estimates_market_percentile.sql b/tradein-mvp/backend/data/sql/267_trade_in_estimates_market_percentile.sql index 90be92ad..55b4a487 100644 --- a/tradein-mvp/backend/data/sql/267_trade_in_estimates_market_percentile.sql +++ b/tradein-mvp/backend/data/sql/267_trade_in_estimates_market_percentile.sql @@ -6,15 +6,25 @@ -- позицию по сохранённому top-10 нельзя — это другая популяция, поэтому значение -- обязано персиститься вместе с оценкой. -- --- smallint: диапазон значений 1..99 по построению (`_market_percentile` зажимает --- края — «0-й перцентиль» читался бы как «дешевле всех на свете», хотя означает лишь --- край выборки). NULL = когорта меньше MARKET_PERCENTILE_MIN_N (15) либо оценки нет. +-- smallint: диапазон 1..99 по построению (`_market_percentile` зажимает края — +-- «0-й перцентиль» читался бы как «дешевле всех на свете», хотя означает лишь край +-- выборки). NULL = когорта меньше MARKET_PERCENTILE_MIN_N (15) либо оценки нет. +-- Бэкфилла нет и быть не может: позицию старых строк восстановить не из чего. -- --- Идемпотентно: IF NOT EXISTS. Блокировки не берёт (ADD COLUMN без DEFAULT в PG 11+ --- не переписывает таблицу). +-- ПРО ЛОКИ (#2752). ADD COLUMN без DEFAULT в PG 11+ не переписывает таблицу и держит +-- ACCESS EXCLUSIVE миллисекунды — но ЖДАТЬ его выдачи может сколько угодно, и всё это +-- время ждущий DDL стоит в очереди ПЕРЕД новыми запросами приложения к той же таблице. +-- Ровно так миграция 250 встала на 29 минут за чужой psql-сессией. lock_timeout +-- ограничивает только ожидание: не дождались — красный деплой вместо тихой очереди. +BEGIN; + +SET LOCAL lock_timeout = '5s'; + ALTER TABLE trade_in_estimates ADD COLUMN IF NOT EXISTS market_percentile smallint; COMMENT ON COLUMN trade_in_estimates.market_percentile IS '#2899: доля аналогов дешевле этой квартиры, 1..99. NULL — когорта < 15 лотов. ' 'НЕ location_index_pct (тот про район против медианы города).'; + +COMMIT;