linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Эксплуатация и наблюдаемость/pg-stat-map

kb/ops ── Эксплуатация и наблюдаемость ── intermediate

Карта pg_stat_* и pg_stat_statements

Системные представления pg_stat_* - встроенный мониторинг PostgreSQL. pg_stat_activity показывает, кто что делает прямо сейчас; pg_stat_*_tables и pg_statio_* - накопленную статистику по таблицам; pg_stat_statements - агрегат по нормализованным запросам, главный инструмент поиска медленного SQL.

view as markdownaka: pg-stat, observability

Две природы статистики

Представления pg_stat_* делятся на два сорта, и путать их - частая ошибка при диагностике.

  • Мгновенный снимок - что происходит сейчас. pg_stat_activity (по строке на backend), pg_locks, pg_stat_replication (см. streaming-replication), pg_stat_progress_vacuum. Читаешь - видишь текущее состояние.
  • Накопленные счётчики - сумма с момента сброса статистики. pg_stat_user_tables, pg_statio_user_tables, pg_stat_database, pg_stat_statements. Само число мало о чём говорит; смысл - в разнице двух замеров (дельте) за интервал.

Главное следствие: по накопленным счётчикам нельзя сказать «сейчас плохо». Можно сказать «за час между замерами выросло вот это».

Кто что делает прямо сейчас

pg_stat_activity - первый экран при «база тормозит». Строка на каждое соединение: state (active / idle / idle in transaction), текущий query, время начала, wait_event.

sql
-- активные дольше 30 секунд и зависшие в транзакции
SELECT pid, state, wait_event_type, wait_event,
       now() - xact_start AS xact_age, left(query, 60) AS q
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY xact_age DESC NULLS LAST;

idle in transaction с большим xact_age - тревога: такой backend держит горизонт (см. transaction-horizon) и мешает vacuum, даже ничего не делая.

Здоровье таблиц

pg_stat_user_tables отвечает на «нужен ли vacuum» и «берётся ли индекс»: n_live_tup/n_dead_tup, last_autovacuum, seq_scan против idx_scan. pg_statio_user_tables - про кеш: heap_blks_hit против heap_blks_read - попадания в буфер против чтений с диска (см. buffer-states).

Поиск медленного SQL: pg_stat_statements

Расширение агрегирует выполнение по нормализованному тексту: запросы WHERE id = 1 и WHERE id = 2 схлопываются в один WHERE id = $1. Поэтому одно тяжёлое место видно как одна строка с суммой по всем вызовам - в отличие от лога, где это тысячи отдельных записей.

sql
SELECT queryid, calls, round(total_exec_time) AS total_ms,
       round(mean_exec_time, 1) AS mean_ms, left(query, 70) AS q
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

Сортируй по total_exec_time (суммарное время), а не по mean - запрос на 2 мс, вызванный миллион раз, съедает больше, чем разовый отчёт на 10 секунд. Это и есть «виновник» нагрузки.

Дополняет картину log_min_duration_statement - порог, выше которого каждый медленный запрос пишется в лог сервера целиком, с параметрами. pg_stat_statements говорит «какой класс запросов жрёт время», лог - «вот конкретный вызов с этими значениями».

Дальше: настройка памяти под найденные запросы - memory-config; переписывание плохих запросов - anti-patterns.

§ команды

bash
SELECT pid, state, wait_event, query FROM pg_stat_activity WHERE state <> 'idle';

Кто активен прямо сейчас и чего ждёт

bash
SELECT query, calls, total_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;

Топ запросов по суммарному времени - главный отчёт о нагрузке

bash
SELECT relname, n_dead_tup, last_autovacuum FROM pg_stat_user_tables ORDER BY n_dead_tup DESC;

Где копится мусор и когда autovacuum приходил в последний раз

bash
SELECT pg_stat_statements_reset();

Сбросить счётчики, чтобы мерить дельту за чистый интервал

§ см. также

  • memory-configКонфигурация памяти в контексте механизмаЧетыре параметра памяти решают разные задачи. shared_buffers - общий кеш страниц на весь кластер. work_mem - лимит на ОДНУ операцию сортировки или хеша в ОДНОМ запросе, и его легко умножить на сотни. maintenance_work_mem - для vacuum и build индекса. effective_cache_size - подсказка планировщику, не аллокация.
  • anti-patternsКаталог анти-паттернов (cheat sheet)Набор ошибок, которые компилируются и проходят тесты, но врут на проде. NOT IN с NULL глотает строки. BETWEEN по времени ловит лишнюю границу. COUNT по nullable-колонке считает не то. Целочисленное деление режет дробь. char(n), money и timestamp без TZ создают проблемы на пустом месте.
  • backup-pitrBackup и восстановление на точку (PITR)Планируй восстановление, а не бэкап. pg_dump делает логический снимок на один момент. PITR строится из базовой физической копии (pg_basebackup) плюс непрерывного архива WAL: можно восстановиться на любой момент между копией и «сейчас» - в том числе на секунду до ошибочного DROP.
  • transaction-horizonГоризонт транзакцииГоризонт - минимум backend_xmin по всем активным транзакциям. Версию строки можно убрать, только если она стала мёртвой раньше горизонта. Одна долгая или idle-in-transaction транзакция отодвигает горизонт назад и запрещает уборку мусора во всей базе.
  • buffer-statesЧетыре состояния буфераЛюбое обращение к данным сводится к одному из четырёх исходов: hit (страница в кеше), read (промах, чтение с диска), dirtied (изменён в памяти), written (сброшен на диск). Соотношение hit к read показывает эффективность кеша; в PG16 их детально считает pg_stat_io.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки