Планирование ёмкости и аудит раздувания
Прогнозируйте рост дискового пространства и IOPS, регулярно проверяйте раздувание таблиц и индексов и планируйте обновления до того, как закончится место
«Планирование ёмкости и аудит раздувания» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что прогнозировать
Чтобы рассчитать размер базы данных на следующие 6–12 месяцев, спрогнозируйте:
- Использование диска (данные + WAL + индексы)
- Потребность в IOPS
- Рабочий набор в RAM
- Количество соединений
Рост дискового пространства
Отслеживайте недавнюю динамику роста:
SELECT pg_size_pretty(pg_database_size(current_database()));
SELECT pg_size_pretty(pg_total_relation_size(t.oid)) AS total,
relname
FROM pg_class t
WHERE relkind = 'r'
ORDER BY pg_total_relation_size(t.oid) DESC LIMIT 20;Отслеживание роста таблиц
Запланируйте задачу журналирования метрик и построьте по ним график:
INSERT INTO size_history (ts, tablename, size_bytes)
SELECT NOW(), relname, pg_total_relation_size(oid)
FROM pg_class WHERE relkind = 'r';Оценка IOPS
Таблицы с высокой нагрузкой на чтение видны в pg_stat_user_tables:
SELECT relname, seq_tup_read, idx_tup_fetch,
seq_tup_read + idx_tup_fetch AS total_reads
FROM pg_stat_user_tables
ORDER BY total_reads DESC LIMIT 20;Расчёт объёма RAM
shared_buffers ≈ 25% RAM. effective_cache_size ≈ 75% (подсказка планировщику, а не выделение памяти). work_mem на одно соединение × количество соединений не должно превышать доступный объём RAM.
Аудит раздувания
Найдите таблицы с наибольшим числом мёртвых строк:
SELECT relname,
n_live_tup,
n_dead_tup,
round(n_dead_tup::numeric / NULLIF(n_live_tup, 0), 2) AS dead_ratio,
last_autovacuum
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 20;Раздувание индексов
Используйте pgstattuple или встроенные инструменты:
CREATE EXTENSION pgstattuple;
SELECT relname,
pg_size_pretty(pg_relation_size(indexrelid)) AS size,
(pgstatindex(indexrelid::regclass)).leaf_fragmentation
FROM pg_stat_user_indexes
ORDER BY pg_relation_size(indexrelid) DESC LIMIT 20;Неиспользуемые индексы
Найдите и удалите их — они увеличивают нагрузку на запись:
SELECT schemaname, relname, indexrelname,
pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE idx_scan = 0
AND indexrelname NOT LIKE '%_pkey'
ORDER BY pg_relation_size(indexrelid) DESC;Аудит соединений
Сколько клиентов подключено и в каком они состоянии:
SELECT datname, usename, application_name, state, COUNT(*)
FROM pg_stat_activity
GROUP BY 1,2,3,4 ORDER BY 5 DESC;Долгие транзакции
Причина голодания процесса очистки:
SELECT pid, state, xact_start, NOW() - xact_start AS xact_age, query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_age DESC NULLS LAST LIMIT 20;WAL и архивы
Отслеживайте скорость генерации WAL, чтобы рассчитать объём архивного хранилища:
SELECT pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0')) AS total_wal_generated;Планирование переключения при отказе
Диск реплики должен быть такого же размера, как диск основного сервера. Убедитесь, что скорость синхронизации реплики не ниже скорости записи на основном сервере.
Итоги
Планирование ресурсов — это построение графиков для правильных метрик.
- Рост размера отдельных таблиц
- Доля мёртвых строк
- Неиспользуемые индексы
- Долгие транзакции, блокирующие очистку
- Количество соединений
Быстрая проверка
Какое представление следует запросить, чтобы найти таблицы с наибольшим числом мёртвых строк для планирования очистки?
Часто задаваемые вопросы
Урок «Планирование ёмкости и аудит раздувания» бесплатный?
Да — полный текст урока «Планирование ёмкости и аудит раздувания» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Планирование ёмкости и аудит раздувания»?
Прогнозируйте рост дискового пространства и IOPS, регулярно проверяйте раздувание таблиц и индексов и планируйте обновления до того, как закончится место Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Планирование ёмкости и аудит раздувания»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- pg_stat_statements: самые ресурсоёмкие запросы
- pgBadger для анализа журналов
- Пулинг соединений: PgBouncer
- Планирование ёмкости и аудит раздувания