TGViewer
Канал с кабанчиком Канал с кабанчиком @boar_channel · 118 subscribers
Post #36 369
Занимаюсь сейчас одной задачей - нужно смигрировать БД размером 1.8 Тб в платформу, где есть ограничение в 1 Тб. Собственно, нужно что-то придумать чтобы вместиться. Параллельно с анализом возможности разбиения этой базы или шардирования решил посмотреть в сторону старой доброй нормализации данных - не повторяются ли одни и те же данные в разных строках. Может быть можно что-то вынести отдельно?

И да, уже даже невооруженным взглядом вижу, что прямо в таблице транзакций упоминаются названия компаний (и они, очевидно, не уникальные). Явный кандидат на вынесение. Но как оценить потенциальную пользу от вынесения компаний в отдельную таблицу? И как отследить другие подобные колонки кандидаты для нормализации?

Идем смотреть статистику по таблице от самой БД:
SELECT attname, avg_width, n_distinct
FROM pg_stats
WHERE tablename = 'transaction'
AND n_distinct > 0
ORDER BY avg_width DESC;


Получаем примерно такие результаты:
| attname | avg_width | n_distinct |
| ------------------ | --------- | ---------- |
| details | 114 | 34717 |
| okved_description | 104 | 1392 |
| counter_party_name | 58 | 22992 |
| model_version | 29 | 1 |
| ... |


Тут видно, что значения в колонке details имеют средний размер в 114 байт, при этом уникальных значений 34717. Ах да, а всего строк в этой таблице - примерно 1.2 миллиарда. Кажется, тоже неплохой кандидат на нормализацию - мы здесь явно выиграем в полезном пространстве, но сколько? Тут мне стало уже лень считать самостоятельно, тем более повторять это для других колонок.

Выгружаем эту статистику и другие вводные в ChatGPT и получаем отчет:

details
* Avg width: 114 B
* Distinct values: 34 717
* Current size: ~128 GB
* After normalization: ~8 GB
* Gain: ~120 GB

okved_description
* Avg width: 104 B
* Distinct values: 1 392
* Current size: ~116 GB
* After normalization: ~3 GB
* Gain: ~113 GB

counter_party_name
* Avg width: 58 B
* Distinct values: 22 992
* Current size: ~65 GB
* After normalization: ~6 GB
* Gain: ~59 GB

model_version
* Avg width: 29 B
* Distinct values: 1
* Current size: ~33 GB
* After normalization: < 1 GB
* Gain: ~32 GB

Total potential saving: ≈ 320 GB (~55 % of heap).

Экономия хорошая, нужно пробовать. Таким образом на основе системных статистических данных получилось быстро оценить потенциальный профит идеи.
  • 👏 5
  • 👍 2
  • ❤ 1
More from @boar_channel
  1. Jan 27, 2026Не смог пройти мимо тренда, извините
  2. Jan 24, 2026video post
  3. Jan 20, 2026В PostgreSQL есть одна интересная фича под названием exclusion constraint. Она позволяет д…
  4. Jan 11, 2026А вот тут https://arxiv.org/pdf/2512.14982 исследователи утверждают, что простое повторени…
  5. Jan 11, 2026А вот тут https://arxiv.org/pdf/2512.14982 исследователи утверждают, что простое повторени…
  6. Jan 1, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →