Для эффективной работы системы важно отслеживать основные показатели производительности её базы данных. В PostgreSQL существует готовая подсистема, которая осуществляет сбор информации о работе сервера БД, а также предоставляет к ней доступ в виде готовых представлений и функций. Регулярный анализ собранной статистики может помочь администратору и разработчику найти наиболее уязвимые места при ежедневном эксплуатировании базы данных. В этой статье я расскажу об основных статистиках, которые накапливаются в PostgreSQL, в качестве примеров я приведу SQL-запросы на выборку основных показателей работы базы данных, а также затрону встроенные инструменты визуализации статистики в современных GUI для PostgreSQL.
В PostgreSQL сборщик статистики предоставляет доступ к накопленным данным через предопределённые представления. Основные из них показаны ниже на схеме:
На основе данных из представлений пользователь может анализировать полезные показатели, характеризующие работу базы данных.
Для понимания нагрузки на базу данных хорошо знать общий объём транзакций за определенный период времени. Для получения этих данных можно использовать следующий запрос:
SELECT
datname,
xact_commit + xact_rollback ,
stats_reset
FROM pg_stat_database;
Здесь сумма xact_commit и количество xact_rollback – суммарное количество транзакций за период с момента сброса статистических данных stats_reset.
Для мониторинга клиентских подключений можно использовать представление pg_stat_activity, которое отображает информацию по работе серверных процессов. Каждый серверный процесс может находиться в следующих состояниях:
Получить общее количество соединений по состояниям позволяет следующая группировка:
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state;
Длительность текущих активных транзакций и запросов можно проанализировать, выполнив запрос:
SELECT
datname,
usename,
now() - xact_start AS TransactionDuration,
now() - query_start as QueryDuration
FROM pg_stat_activity
WHERE state = 'active';
Статистику обращений к таблицам базы данных предоставляет pg_stat_all_tables. Представление позволяет оценить, например, общий объём insert, update, delate операций к таблице. Определить наиболее часто используемые таблицы в БД можно с помощью запроса:
SELECT
relname,
n_tup_upd+n_tup_ins+n_tup_del AS operationsAmount
FROM pg_stat_all_tables
ORDER BY operationsAmount DESC;
Для анализа эффективности чтения данных в конкретной таблице можно получить соотношение запросов, выполненных с использованием индексов к количеству запросов, читающих данные путём последовательного сканирования таблиц. Отсортированный список таблиц по данному соотношению вернёт следующий запрос:
SELECT
relname,
seq_scan,
idx_scan,
idx_scan/seq_scan as IndexStat
FROM pg_stat_all_tables
WHERE seq_scan <> 0
ORDER BY IndexStat DESC;
Полную информацию по созданным в базе данных индексам содержит представление pg_stat_all_indexes. Устаревшие индексы можно обнаружить с помощью запроса:
SELECT
indexrelname,
relname,
idx_tup_read/idx_tup_fetch as stats
FROM pg_stat_all_indexes
WHERE idx_tup_fetch <> 0
ORDER BY stats DESC;
Здесь idx_tup_read/idx_tup_fetch – это отношение записей из индекса, возвращённых в запросах по этому индексу, к общему числу записей, для которых пришлось обращаться к родительским таблицам. Если этот коэффициент меньше единицы, значит много данных читается в обход индекса, поэтому его необходимо обновить.
Для администраторов баз данных и программистам важно быстро определять производительность СУБД, анализировать проблемы с дисковым пространством, контролировать количество подключений и т.д. Поэтому современные GUI-клиенты предлагают собственные панели мониторинга для СУБД. Наиболее развитые системы мониторинга существуют в следующих графических приложениях:
Название |
Описание |
OC |
Фишки мониторинга |
pgAdmin |
Бесплатный GUI-клиент с открытым исходным кодом |
Linux, Windows, macOS |
Предопределенный дашборд (серверные сеансы, блокировки, транзакции в секунду; операции с записями), отображение дополнительной статистики |
DBeaver |
Бесплатный GUI-клиент с дополнительными платными версиями. |
Linux, Windows, macOS |
Предопределенный дашборд (серверные сеансы, блокировки, транзакции в секунду), возможность доработки дашбордов на базе предопределённых дашбордов. |
В DBeaver используется функция Dashboard, с помощью которой можно настроить пользовательские панели из соответствующих виджетов для мониторинга. По умолчанию в DBeaver поставляются виджеты для нескольких предопределенных информационных панелей мониторинга. Создать информационную панель можно из набора готовых шаблонов виджетов:
Предопределённые виджеты изменять в DBeaver нельзя, однако можно создать новый виджет путём копирования шаблона. В диалоговом окне можно настроить новые параметры шаблона и реализовать свой запрос для получения данных виджета:
Аналогичные шаблоны также реализованы и в клиенте pgAdmin, однако дополнительно в нём присутствуют следующие виджеты:
Также в pgAdmin на вкладке "Статистика" отображается готовая сводная статистика для выбранного элемента из дерева БД.
Для пользователя доступны для отслеживания следующие показатели:d – число зафиксированных транзакций за последнюю неделю;
В PostgreSQL сборщик статистики предоставляет полноценную информацию о работе сервера, которую можно регулярно анализировать. Также дополнительно включив модуль pg_stat_statements, СУБД будет отслеживать статистику планирования и выполнения сервером всех операторов SQL. Отдельно стоит выделить базовые возможности GUI-клиентов по мониторингу сервера базы данных. Используя базовые представления статистики PostgreSQL, они предоставляют пользователю готовую информацию в виде дашбордов, что позволяет динамически отслеживать работу сервера и выявлять ошибки.
Дмитрий, не хватает пояснений по интерпретации статистик. Цифры-то я получу, а как мне их понимать и применять? Все хорошо у меня в системе или система работает неправильно? Хотя бы в общих словах по всем рассмотренным статистикам.
Например, соотношение количества операций поиска в индексе и просмотра таблицы: у MS есть рекомендация на этот счет, на которую ориентируемся при аудите здоровья системы. А что в Postgres?
Алексей, напрашивается вторая часть с описанием того, что можно понять по статистике и что с этим делать )
Авторизуйтесь, чтобы написать комментарий