Пейджер

🌍 Привет мир! 👋

🌍 Привет мир! 👋

Как правило, если вы являетесь back-end разработчиком, вы не сильно переживаете за performance базы данных. Вы спокойно пишите свои запросы, местами более сложные, но на этом в общем и целом все. Однако, если проект не маленький, нагрузка прям такая, что порой заставляет смотреть графики, а отдельных специалистов по базе нет. То именно вы! Тот человек, который засучит рукава и пойдет смотреть проблемы с производительностью, иначе никак, грустные клиенты === мало денег. Cегодня про Bloats в #POSTGRESQL.

🚀 Мотивация

Есть парочка пунктов, которые нужно соблюдать, чтобы ваша база данных была производительной: корректные (нормализованные) таблицы, запросы, индексы и наверное еще… (пишем в комментариях, что не упомянул). Сегодня разговор пойдет про bloats, о которых не все разработчики знают, но они прям могут вызвать деградацию вашей базы данных.

Что такое bloat

PostgreSQL хранит данные в файлах на диске. Частые операции update и delete могут привести к ситуации, когда в файлах остается много неиспользуемого пространства, это называется bloat. Так происходит потому что система не удаляет старые данные немедленно. Вместо этого она помечает их как устаревшие и добавляет новые данные в другом месте. Этот процесс является частью концепции PostgreSQL, которая обеспечивает data consistency и позволяет выполнять одновременно нескольких транзакций.

🔍 Как найти раздутые таблицы или индексы

Да, раздутие может быть как на таблицах, так и на индексах. И благо postgre сам следит за dead_tuple (bloats), все что нужно сделать чтобы найти их, это пара SQL запросов, далее сделать анализ и при необходимости почистить.

📌 pgstattuple - модуль, который хранит информацию о таблицах и индексах в базе. Позволяет определить количество "мертвого пространства".

‼️ Как правило “порог выраженный в процентах" с которого bloats таблиц или индексов, должно вызывать беспокойство, может варьироваться в зависимости от конкретного использования и конфигурации базы данных. Однако, общая рекомендация, это примерно превышение 20-30% от общего объема данных таблицы (индекса).

📌 Находим таблицы, у которых раздутие более 30% (Скрипт)
📌 Находим индексы, у которых раздутие более 30% (Скрипт)

👇 Основные способы уменьшения раздувания:

💡 VACUUM - команда, которая является основным инструментом для борьбы с раздуванием.

Выполняет задачи:
Очищает dead tuples, строки которые были обновлены или удалены, но все еще занимают место.
Обновляет статистику базы данных. Точная статистика помогает принимать лучшие решения для query execution plans.

VACUUM example_table;


💡 REINDEX - команда которая перестраивает индекс, чтобы удалить раздувание. Можно использовать для определенного индекса, таблицы или всей базы данных.

REINDEX TABLE example_table;
REINDEX INDEX example_index;


‼️ Обратите внимание:

🖇️ Функция autovacuum автоматически выполняет операции VACUUM.

🖇️ Можно использовать тонкую настройку через параметры в конфигурации autovacuum_vacuum_scale_factor, autovacuum_analyze_scale_factor и autovacuum_vacuum_threshold на основе рабочей нагрузки и характеристик таблицы.

🖇️ Vacuum full освобождает больше места, но блокирует таблицу. Лучше использовать в периоды низкой активности.

🖇️ Регулировка Fillfactor для таблиц и индексов. Более низкий fillfactor оставляет больше места для обновлений, снижая скорость накопления раздувания

💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк! 👍

#POSTGRESQL
Медиа 1
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram