И да, уже даже невооруженным взглядом вижу, что прямо в таблице транзакций упоминаются названия компаний (и они, очевидно, не уникальные). Явный кандидат на вынесение. Но как оценить потенциальную пользу от вынесения компаний в отдельную таблицу? И как отследить другие подобные колонки кандидаты для нормализации?
Идем смотреть статистику по таблице от самой БД:
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).
Экономия хорошая, нужно пробовать. Таким образом на основе системных статистических данных получилось быстро оценить потенциальный профит идеи.