fix(db): DROP dead BRIN index rosreestr_deals_period_brin #122

Merged
lekss361 merged 1 commit from fix/drop-dead-brin-rosreestr into main 2026-05-14 20:29:01 +00:00
lekss361 commented 2026-05-14 20:21:58 +00:00 (Migrated from github.com)

Summary

Per code review audit (May 14): BRIN index rosreestr_deals_period_brin на partitioned parent — dead weight. PG16 НЕ propagates на child partitions; parent сам без данных; queries не trigger BRIN scan.

Migration: data/sql/89_drop_dead_brin_rosreestr_deals.sql — атомарный DROP с idempotent IF EXISTS.

Cleanup: 01_schema_rosreestr_deals.sql:65-67 — закомментировал CREATE с tombstone-note (fresh bootstrap не создаст заново).

Why dead

  • PG16 documentation + grep — BRIN на partitioned parent НЕ propagates на children
  • Parent rosreestr_deals holds zero rows (все 7 child partitions содержат данные)
  • Zero query references к индексу по имени в коде
  • Expected pg_stat_user_indexes.idx_scan = 0 (verify SELECT в migration file header)

Apply на prod

После merge:

ssh -N gendesign  # tunnel
psql postgresql://gendesign:...@localhost:15432/gendesign \
  -f data/sql/89_drop_dead_brin_rosreestr_deals.sql

Verify SELECTы в header migration file: idx_scan ожидается 0 + индекс existed только на parent.

Rollback path

Re-create per-partition если нужен (но обычно partition pruning достаточно):

CREATE INDEX rosreestr_deals_2024q1_period_brin
  ON rosreestr_deals_2024q1 USING BRIN (period_start_date);

Vault

fixes/Migration_Drop_Dead_Brin_May14.md — status ready_to_apply с verification + apply steps + rollback.

## Summary Per code review audit (May 14): BRIN index `rosreestr_deals_period_brin` на partitioned parent — dead weight. PG16 НЕ propagates на child partitions; parent сам без данных; queries не trigger BRIN scan. **Migration:** `data/sql/89_drop_dead_brin_rosreestr_deals.sql` — атомарный DROP с idempotent `IF EXISTS`. **Cleanup:** `01_schema_rosreestr_deals.sql:65-67` — закомментировал CREATE с tombstone-note (fresh bootstrap не создаст заново). ## Why dead - PG16 documentation + grep — BRIN на partitioned parent НЕ propagates на children - Parent `rosreestr_deals` holds **zero rows** (все 7 child partitions содержат данные) - Zero query references к индексу по имени в коде - Expected `pg_stat_user_indexes.idx_scan = 0` (verify SELECT в migration file header) ## Apply на prod После merge: ```bash ssh -N gendesign # tunnel psql postgresql://gendesign:...@localhost:15432/gendesign \ -f data/sql/89_drop_dead_brin_rosreestr_deals.sql ``` Verify SELECTы в header migration file: `idx_scan` ожидается 0 + индекс existed только на parent. ## Rollback path Re-create per-partition если нужен (но обычно partition pruning достаточно): ```sql CREATE INDEX rosreestr_deals_2024q1_period_brin ON rosreestr_deals_2024q1 USING BRIN (period_start_date); ``` ## Vault `fixes/Migration_Drop_Dead_Brin_May14.md` — status `ready_to_apply` с verification + apply steps + rollback.
lekss361 commented 2026-05-14 20:25:03 +00:00 (Migrated from github.com)

Bot review

Аккуратный split: comment-out CREATE в 01_schema_* + новый 89_drop_*.sql migration с BEGIN/COMMIT, IF EXISTS, embedded verification SELECTs.

Merge безопасный — PR добавляет файл и комментирует строку. Сам DROP INDEX НЕ выполняется автоматически на prod (нет migration runner); оператор запускает psql вручную по плану в PR body. Поэтому риск merge-time = 0.

Reversible — если idx_scan оказывается > 0 (вопреки PG16-предположению), CREATE INDEX per-partition восстанавливает функциональность. Rollback path задокументирован в migration header.

🟡 Pre-apply gate (для оператора, не блокер мерджа) — PR header честно говорит: «DB connection was unavailable at migration creation time. idx_scan=0 inferred». Перед psql -f 89_drop_*.sql обязательно запустить два verification SELECT'а из header migration файла (pg_stat_user_indexes.idx_scan + pg_indexes где тaблица = rosreestr_deals parent). Если idx_scan > 0 — НЕ применять.

CI

  • backend:
  • frontend: 🔄

Мерджу когда frontend CI зелёный.

## Bot review Аккуратный split: comment-out CREATE в `01_schema_*` + новый `89_drop_*.sql` migration с `BEGIN/COMMIT`, `IF EXISTS`, embedded verification SELECTs. ✅ **Merge безопасный** — PR добавляет файл и комментирует строку. Сам `DROP INDEX` НЕ выполняется автоматически на prod (нет migration runner); оператор запускает psql вручную по плану в PR body. Поэтому риск merge-time = 0. ✅ **Reversible** — если `idx_scan` оказывается > 0 (вопреки PG16-предположению), `CREATE INDEX` per-partition восстанавливает функциональность. Rollback path задокументирован в migration header. 🟡 **Pre-apply gate (для оператора, не блокер мерджа)** — PR header честно говорит: «DB connection was unavailable at migration creation time. idx_scan=0 inferred». Перед `psql -f 89_drop_*.sql` обязательно запустить два verification SELECT'а из header migration файла (`pg_stat_user_indexes.idx_scan` + `pg_indexes` где тaблица = `rosreestr_deals` parent). Если `idx_scan > 0` — НЕ применять. ### CI - backend: ✅ - frontend: 🔄 Мерджу когда frontend CI зелёный.
lekss361 commented 2026-05-14 20:27:49 +00:00 (Migrated from github.com)

Tracking: part of audit batch #127. Vault: fixes/Migration_Drop_Dead_Brin_May14.md.

Tracking: part of audit batch #127. Vault: `fixes/Migration_Drop_Dead_Brin_May14.md`.
lekss361 commented 2026-05-14 20:28:45 +00:00 (Migrated from github.com)

Final review (SHA 5acca40, CI )

  • backend: SUCCESS
  • frontend: SUCCESS
  • Merge безопасный (только файл + комментарий); оператор применит migration по plan

approve merge

## Final review (SHA `5acca40`, CI ✅) - backend: SUCCESS - frontend: SUCCESS - Merge безопасный (только файл + комментарий); оператор применит migration по plan approve merge
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#122
No description provided.