PostgreSQL для 1С: как найти тяжелый запрос, повесивший сервер (модуль pg_stat_statements)
- Программа 1С зависает у всех пользователей при проведении документов или формировании отчетов.
- Процессор сервера загружен на 100% процессами
postgres.exeилиpostgresв Linux. - База данных перестает отвечать, а перезапуск службы 1С помогает лишь на несколько минут.
- Непонятно, какой именно пользователь или отчет отправляет тяжелые SQL-запросы в СУБД.
Что это такое простыми словами?
Когда в 1С формируют огромный отчет (например, за 5 лет без фильтра), 1С отправляет в базу данных PostgreSQL сложный SQL-запрос. Сервер базы начинает перебирать миллионы строк, из-за чего процессор раскаляется до предела, а у остальных сотрудников всё «висит». Модуль pg_stat_statements — это встроенный «черный ящик» PostgreSQL, который протоколирует каждый запрос, время его выполнения и количество обращений к диску.
Шаг 1. Включение модуля в конфигурации PostgreSQL
Откройте файл postgresql.conf (обычно находится в папке с данными базы) в Блокноте или любом редакторе и добавьте в конец строки:
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = allШаг 2. Перезапуск службы PostgreSQL
Для вступления изменений в силу перезапустите службу через оснастку Windows services.msc (служба postgresql-x64-XX) или в консоли Linux:
sudo systemctl restart postgresqlШаг 3. Активация расширения в рабочей базе 1С
Откройте программу pgAdmin или консоль psql, подключитесь к вашей базе 1С и выполните команду:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;Шаг 4. Поиск запроса-вредителя
Чтобы увидеть топ-5 самых долгих запросов, выполните в окне SQL-запросов:
SELECT
round(total_exec_time::numeric, 2) AS total_time_ms,
calls,
round(mean_exec_time::numeric, 2) AS avg_time_ms,
substr(query, 1, 150) AS query_preview
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 5;По первым строкам вы сразу увидите имя таблицы 1С (например, _Document123 или _AccumRgTn), что позволит программисту 1С точно понять, какой документ или регистр перегружает базу.
Частые вопросы (FAQ)
Сильно ли модуль pg_stat_statements замедляет работу PostgreSQL?
Практически нет. Накладные расходы составляют менее 1-2% производительности, поэтому его держат включенным на всех рабочих серверах 1С.
Как сбросить накопленную статистику, чтобы начать замер заново?
Достаточно выполнить команду: SELECT pg_stat_statements_reset(); — вся прошлая статистика обнулится.
Что делать, если база зависла прямо сейчас и не откликается?
Выполните запрос SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'active' AND now() - query_start > interval '5 minutes'; чтобы принудительно снять зависшие операции без перезагрузки сервера.
Почему имена таблиц в запросах выглядят как _InfoRg123, а не как в 1С?
1С хранит данные во внутренних таблицах с техническими именами. Чтобы сопоставить их с привычными объектами, программисты используют функцию 1С ПолучитьСтруктуруХраненияБазыДанных().