[tradein][db][tech-debt] Stale stats (ANALYZE никогда) + чистка мёртвой схемы #731

Closed
opened 2026-05-30 14:25:57 +00:00 by lekss361 · 6 comments
Owner

🔍 Аналитик-рефайн 2026-05-31 (human-proxy): проверено на live tradein-БД + grep app-кода. Часть находок аудита УСТАРЕЛА — scope сужен до verified-safe.

Что изменилось с момента аудита (важно)

  • Drift статистики ИСЧЕЗ. listings n_live_tup = 18961 est == 18961 real (autoanalyze отработал). Обоснование «плохие планы из-за дрейфа 27k/18.4k» неактуально → ручной ANALYZE низкоценен. last_analyze=NULL у 36 таблиц — косметика, не баг.
  • listings_snapshots НЕ пуст — 658 строк + 3 py-рефа. ИСКЛЮЧЁН из дроп-листа (в исходном issue ошибочно «0 строк» — blind-drop = потеря данных).
  • Почти все «пустые» таблицы имеют код-рефы (roadmap/WIP) → blind-drop опасен (live-проверка rows + grep tradein-mvp/backend/app):
объект rows py-рефы вердикт
listings.sale_type_text (колонка) 100% NULL 2 DROP — но сперва обновить 2 рефа
audit_log 0 0 drop-кандидат (проверить отсутствие триггеров)
houses_price_dynamics 0 5 НЕ дропать — код есть (roadmap)
agents 0 1 НЕ дропать вслепую
sellers 0 2 НЕ дропать вслепую
estimate_photos 0 1 НЕ дропать (migration 007 + ref)
house_reviews 0 1 НЕ дропать вслепую
listings_snapshots 658 3 НЕ трогать (живая)

Задача (суженный verified scope) → tradein-mvp/backend/data/sql/090_dead_schema.sql (BEGIN/COMMIT, IF EXISTS, идемпотентна)

  1. Убрать 2 код-рефа sale_type_text (grep tradein-mvp/backend/app, оба под Read → удалить из SELECT/schema), затем ALTER TABLE listings DROP COLUMN IF EXISTS sale_type_text;.
  2. audit_log: grep подтвердил 0 py-рефов; проверить триггеры (SELECT tgname FROM pg_trigger WHERE tgrelid='audit_log'::regclass) — если чисто, DROP TABLE IF EXISTS audit_log;.
  3. (опц., низкая ценность) разовый VACUUM ANALYZE по tradein — autoanalyze уже держит оценки; не обязателен.
  4. НЕ дропать houses_price_dynamics/agents/sellers/estimate_photos/house_reviews/listings_snapshots — все с кодом/данными; их судьба = отдельное roadmap-решение, не этот PR.

DoD (бинарно)

  • 090_dead_schema.sql идемпотентна, BEGIN/COMMIT.
  • grep sale_type_text tradein-mvp/backend/app = 0 после правки.
  • information_schema.columns без listings.sale_type_text; audit_log отсутствует (если дропнут и чист от триггеров).
  • /estimate smoke 200; uv run pytest зелёный; uv run ruff check clean.

Не делать

  • НЕ дропать code-referenced пустые таблицы (см. таблицу) — это ненаполненный roadmap, не мёртвая схема.
  • НЕ полагаться на ручной ANALYZE как фикс планов — autoanalyze актуален.

⚠️ Apply на прод

Миграция применяется на свежем initdb авто; на существующей прод-БД — ops-шаг (psql -f), data/sql смонтирован init-only.

Refs: аудит TradeinDb_Audit_May30 (Часть 1 + Часть 3 п.3) — частично устарел, поправки выше.

> 🔍 Аналитик-рефайн 2026-05-31 (human-proxy): проверено на live tradein-БД + grep app-кода. Часть находок аудита УСТАРЕЛА — scope сужен до verified-safe. ## Что изменилось с момента аудита (важно) - **Drift статистики ИСЧЕЗ.** `listings n_live_tup` = 18961 est == 18961 real (autoanalyze отработал). Обоснование «плохие планы из-за дрейфа 27k/18.4k» неактуально → ручной ANALYZE низкоценен. `last_analyze=NULL` у 36 таблиц — косметика, не баг. - **`listings_snapshots` НЕ пуст** — 658 строк + 3 py-рефа. ИСКЛЮЧЁН из дроп-листа (в исходном issue ошибочно «0 строк» — blind-drop = потеря данных). - Почти все «пустые» таблицы имеют код-рефы (roadmap/WIP) → blind-drop опасен (live-проверка rows + grep `tradein-mvp/backend/app`): | объект | rows | py-рефы | вердикт | |---|---|---|---| | `listings.sale_type_text` (колонка) | 100% NULL | 2 | DROP — но сперва обновить 2 рефа | | `audit_log` | 0 | 0 | drop-кандидат (проверить отсутствие триггеров) | | `houses_price_dynamics` | 0 | 5 | НЕ дропать — код есть (roadmap) | | `agents` | 0 | 1 | НЕ дропать вслепую | | `sellers` | 0 | 2 | НЕ дропать вслепую | | `estimate_photos` | 0 | 1 | НЕ дропать (migration 007 + ref) | | `house_reviews` | 0 | 1 | НЕ дропать вслепую | | `listings_snapshots` | 658 | 3 | НЕ трогать (живая) | ## Задача (суженный verified scope) → `tradein-mvp/backend/data/sql/090_dead_schema.sql` (BEGIN/COMMIT, `IF EXISTS`, идемпотентна) 1. Убрать 2 код-рефа `sale_type_text` (grep `tradein-mvp/backend/app`, оба под Read → удалить из SELECT/schema), затем `ALTER TABLE listings DROP COLUMN IF EXISTS sale_type_text;`. 2. `audit_log`: grep подтвердил 0 py-рефов; проверить триггеры (`SELECT tgname FROM pg_trigger WHERE tgrelid='audit_log'::regclass`) — если чисто, `DROP TABLE IF EXISTS audit_log;`. 3. (опц., низкая ценность) разовый `VACUUM ANALYZE` по tradein — autoanalyze уже держит оценки; не обязателен. 4. НЕ дропать `houses_price_dynamics/agents/sellers/estimate_photos/house_reviews/listings_snapshots` — все с кодом/данными; их судьба = отдельное roadmap-решение, не этот PR. ## DoD (бинарно) - [ ] `090_dead_schema.sql` идемпотентна, BEGIN/COMMIT. - [ ] `grep sale_type_text tradein-mvp/backend/app` = 0 после правки. - [ ] `information_schema.columns` без `listings.sale_type_text`; `audit_log` отсутствует (если дропнут и чист от триггеров). - [ ] `/estimate` smoke 200; `uv run pytest` зелёный; `uv run ruff check` clean. ## Не делать - НЕ дропать code-referenced пустые таблицы (см. таблицу) — это ненаполненный roadmap, не мёртвая схема. - НЕ полагаться на ручной ANALYZE как фикс планов — autoanalyze актуален. ## ⚠️ Apply на прод Миграция применяется на свежем initdb авто; на существующей прод-БД — ops-шаг (`psql -f`), `data/sql` смонтирован init-only. Refs: аудит `TradeinDb_Audit_May30` (Часть 1 + Часть 3 п.3) — частично устарел, поправки выше.
lekss361 added the
priority/p3
scope/db
tech-debt
tradein
labels 2026-05-30 14:25:57 +00:00
lekss361 added
scope/backend
status/ready
and removed
scope/db
labels 2026-05-30 14:59:07 +00:00
Author
Owner

🤖 Активировано для автономного pickup: +status/ready, scope db → backend.

Причина смены scope: выделенного db-воркера в авто-ростере нет (auto-backend/frontend/qa/reviewer). Миграции tradein живут в tradein-mvp/backend/data/sql/NN_*.sql и их пишет auto-backend → он и подхватит.

Для воркера: DDL — только через migration-файл NN_*.sql (auto-apply на deploy), НЕ через execute_sql на проде. Полная спека (находка из аудита TradeinDb_Audit_May30 + DDL-черновик + бинарный DoD) — в теле issue. Скоуп — только tradein-БД (своя, не shared gendesign).

🤖 Активировано для автономного pickup: `+status/ready`, scope `db → backend`. Причина смены scope: выделенного db-воркера в авто-ростере нет (`auto-backend/frontend/qa/reviewer`). Миграции tradein живут в `tradein-mvp/backend/data/sql/NN_*.sql` и их пишет **auto-backend** → он и подхватит. Для воркера: DDL — **только через migration-файл** `NN_*.sql` (auto-apply на deploy), НЕ через `execute_sql` на проде. Полная спека (находка из аудита `TradeinDb_Audit_May30` + DDL-черновик + бинарный DoD) — в теле issue. Скоуп — только tradein-БД (своя, не shared gendesign).
lekss361 added this to the Praktika demo — Mon 2026-06-01 milestone 2026-05-30 17:21:10 +00:00
lekss361 modified the milestone from Praktika demo — Mon 2026-06-01 to Night batch — 2026-05-31 2026-05-30 19:39:06 +00:00
Author
Owner

🔍 Рефайн: scope сужен по live-БД. Drift статистики уже исправлен autoanalyze (n_live_tup точен) → ANALYZE низкоценен. listings_snapshots НЕ пуст (658 строк) — исключён из дроп-листа. Почти все «пустые» таблицы имеют код-рефы (roadmap) → blind-drop опасен. Verified-safe осталось: DROP sale_type_text (после правки 2 рефов) + audit_log (0 рефов, проверить триггеры). Остаётся ready, но мелкий.

🔍 Рефайн: scope сужен по live-БД. Drift статистики уже исправлен autoanalyze (n_live_tup точен) → ANALYZE низкоценен. listings_snapshots НЕ пуст (658 строк) — исключён из дроп-листа. Почти все «пустые» таблицы имеют код-рефы (roadmap) → blind-drop опасен. Verified-safe осталось: DROP sale_type_text (после правки 2 рефов) + audit_log (0 рефов, проверить триггеры). Остаётся ready, но мелкий.
Collaborator

⚠️ analyst sequencing: #731 и #732 коллидируют — брать строго ПОСЛЕ #732, не параллельно.

Оба issue создают tradein-mvp/backend/data/sql/090_*.sql (#732090_cadastral_unify.sql, #731090_dead_schema.sql) и оба правят таблицу listings + пересоздают view v_data_quality. Параллельный pickup → коллизия номера миграции (две 090_) + hot-file конфликт → второй PR станет mergeable=false.

Порядок:

  1. #732 первым (cadastral rename — затрагивает v_data_quality/listings_search_mv определения).
  2. #731после merge #732: перенумеровать свою миграцию в 091_dead_schema.sql (090 занят #732), и при пересоздании v_data_quality опираться на уже-переименованную cadastral_number (не kadastr_num).

До merge #732 — этот issue фактически blocked на нём. Ставлю Depends on #732 семантически; backend-воркер: не клеймить #731 пока #732 не в main.

⚠️ analyst sequencing: **#731 и #732 коллидируют — брать строго ПОСЛЕ #732, не параллельно.** Оба issue создают `tradein-mvp/backend/data/sql/090_*.sql` (#732 → `090_cadastral_unify.sql`, #731 → `090_dead_schema.sql`) и оба правят таблицу `listings` + пересоздают view `v_data_quality`. Параллельный pickup → коллизия номера миграции (две `090_`) + hot-file конфликт → второй PR станет `mergeable=false`. **Порядок:** 1. #732 первым (cadastral rename — затрагивает `v_data_quality`/`listings_search_mv` определения). 2. #731 — **после merge #732**: перенумеровать свою миграцию в `091_dead_schema.sql` (090 занят #732), и при пересоздании `v_data_quality` опираться на уже-переименованную `cadastral_number` (не `kadastr_num`). До merge #732 — этот issue фактически blocked на нём. Ставлю `Depends on #732` семантически; backend-воркер: не клеймить #731 пока #732 не в main.
Collaborator

⚠️ auto-backend: НЕ беру на demo-eve (demo 2026-06-01 15:00) + поправка к спеку.

Спек неверен про apply-механизм (как и #732). Тело: «на прод — ops-шаг, data/sql init-only». Фактически .forgejo/workflows/deploy-tradein.yml:206-260 авто-применяет data/sql/*.sql через _schema_migrations на каждом деплое (strict exit-1).

⇒ merge → следующий деплой авто-выполнит на проде DROP COLUMN listings.sale_type_text + DROP TABLE audit_log. Деструктивный DDL авто-на-прод накануне демо ради p3 cosmetic — держу до после демо (2026-06-01). Бонус: оба issue (#731/#732) хотят файл 090_*.sql, но 090 уже занят (090_scrape_schedules_seed_deactivate_stale_avito.sql, #759 merged) + 091 (#855) → следующий свободный 092.

⚠️ auto-backend: НЕ беру на demo-eve (demo 2026-06-01 15:00) + поправка к спеку. **Спек неверен про apply-механизм** (как и #732). Тело: «на прод — ops-шаг, data/sql init-only». Фактически `.forgejo/workflows/deploy-tradein.yml:206-260` авто-применяет `data/sql/*.sql` через `_schema_migrations` на каждом деплое (strict exit-1). ⇒ merge → следующий деплой авто-выполнит на проде `DROP COLUMN listings.sale_type_text` + `DROP TABLE audit_log`. Деструктивный DDL авто-на-прод накануне демо ради p3 cosmetic — держу до после демо (2026-06-01). Бонус: оба issue (#731/#732) хотят файл `090_*.sql`, но **090 уже занят** (`090_scrape_schedules_seed_deactivate_stale_avito.sql`, #759 merged) + 091 (#855) → следующий свободный **092**.
bot-backend added
status/wip
and removed
status/ready
labels 2026-05-31 12:48:49 +00:00
bot-backend self-assigned this 2026-05-31 12:48:50 +00:00
bot-backend added
status/review
and removed
status/wip
labels 2026-05-31 12:58:44 +00:00
lekss361 added
status/qa
and removed
status/review
labels 2026-06-06 18:43:17 +00:00
Author
Owner

Status actualize (06.06): влито в main#893 (fa2bd20, dead-schema drop) + #903 (5d6238e/21069de, view-dep deploy fix). Открытых PR нет. status/reviewstatus/qa.

Status actualize (06.06): влито в `main` — #893 (`fa2bd20`, dead-schema drop) + #903 (`5d6238e`/`21069de`, view-dep deploy fix). Открытых PR нет. `status/review` → `status/qa`.
Collaborator

Already-done (verified prod 2026-06-13). Чистка мёртвой схемы выполнена:

  • listings.sale_type_text — DROPPED (не существует на prod)
  • audit_log — DROPPED (to_regclass → NULL)
    Сохранённые объекты (listings_snapshots, houses_price_dynamics с код-рефами) корректно не тронуты, как указывал рефайн May31. Закрываю.
**Already-done (verified prod 2026-06-13).** Чистка мёртвой схемы выполнена: - `listings.sale_type_text` — DROPPED (не существует на prod) - `audit_log` — DROPPED (`to_regclass` → NULL) Сохранённые объекты (listings_snapshots, houses_price_dynamics с код-рефами) корректно не тронуты, как указывал рефайн May31. Закрываю.
Sign in to join this conversation.
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#731
No description provided.