Entry tags:
Сравнение требуемого места для различных вариантов хранения флагов в PostgreSQL
Давненько я ничего про PostgreSQL не писал.
Вот исправляюсь.
Как известно таблицы с узкими строками и большим количеством строк в PostgreSQL могут быть неожиданно дорогими по месту на диске.
Так как в PostgreSQL есть 24 байт заголовка + 4 байт в ItemData на строку см: http://www.postgresql.org/docs/9.3/interactive/storage-page-layout.html .
Поэтому (хоть это и нарушение разнообразных нормальных форм) зачастую полезно (если есть возможность) группировать данные в одну строку (с использованием массивов и других структур).
( Read more... )
Вот исправляюсь.
Как известно таблицы с узкими строками и большим количеством строк в PostgreSQL могут быть неожиданно дорогими по месту на диске.
Так как в PostgreSQL есть 24 байт заголовка + 4 байт в ItemData на строку см: http://www.postgresql.org/docs/9.3/interactive/storage-page-layout.html .
Поэтому (хоть это и нарушение разнообразных нормальных форм) зачастую полезно (если есть возможность) группировать данные в одну строку (с использованием массивов и других структур).
( Read more... )
1)Postgres 8.4 и выше
2)pl/pgsql установленный в базе
3)superuser доступ
4)не работает если есть 'always' или 'replica' триггеры (я за свою жизнь ни одного не видел в реальной задаче)
5)не может ужать распухший TOAST (увы)
6)слегка индексы пухнут но именно слегка а не в 2 раза как от VF
7)на активной таблице мождет deadlock давать иногда но я пока в реальности не видел
8)может давать серьезный index bloat если запустить паралельно с очень долгой транзакцией
9)игнорит fillfactor у таблтицы (увы)
10)чтобы в конце процесса отрезать чистые страницы в конце таблицы всеравно понадобится короткий exclusive lock
11)всякие баги невыловленные заранее (тестировал как мог)
Последние обновления:
1)Добавлен ключ --all для обработки всех таблиц в базе за 1 вызов
2)Добавлена эвристика которая оценивает насколько таблица распухла (и не мучает ее почем зря если там нечего ужимать (меньше 30% свободного места). Отключается через --force
3)Добавлена возможность проводить конкурентный reindex через --perform-reindex
4)поддержка работы через DBD::Pg (может ускорять до 2х раз процесс)
5)полностью переделана структура программы так чтобы ее можно было дальше развивать (теперь это не скрипт сваяный на коленке за 1 день а что то похожее на нормальный код)
6)добавлено много уровней verbosibility (--verobse-level=) (by default =1 наиболее удобный 2 но он говорливый)
7)исправлена куча мелких багов вылезающих на всяких нестандартных таблицах и базах
ToDo:
1)обработка всех баз оптом в пределах одного кластера (по аналогии с vacuumdb -a)
пока можно эту штуку эмулировать через:
psql -t -c 'SELECT datname from pg_database where datallowconn is true order by pg_database_size(datname)' | perl -ne 'chomp; if (/^\s(\S+)/) {my $cmd="time ./vacuum_table.pl --host=127.0.0.1 --all --force --perform-reindex --verbose-level=2 --dbname=$1 > $1.log"; print "executing cmd: $cmd\n"; system $cmd;}'
2)попробовать еще ускорить (есть пара идей) но уже сейчас raid10 из 4х дисков при --delay-ratio=0 оно на 100% может нагрузить
3)добавить побольше отладочной иформации при --verbose-level > 2
4)сделать наконец нормальную документацию на английском и описание логики работы
5)(сложно весьма) - сделать возможность при упаковке таблицы задать индекс по которому будет произведена автоматическая кластеризация (задача более чем нетривиальная на самом деле но у меня есть идеи как к ней подобраться)
(Reply) (Thread)