Как сервер 1С меняет параметры у PostgreSQL

27.08.24

База данных - HighLoad оптимизация

А вы знали, что сервер 1С при соединении с базой на сервере PostgreSQL самостоятельно устанавливает некоторые параметры? Это важно знать при настройке сервера и отладке долгих запросов. Предлагаю разобраться.

Вопрос установки параметров сеанса при работе с СУБД PostgreSQL в документации 1С описан плохо, я нашёл только тут, да и то без должного акцента. Подумаешь, какие-то параметры при формировании плана. Почему-то этот вопрос отнесён к крупным внедрениям, а я считаю, что и для "мелких" он тоже актуален. Пока не разобрался, периодически ловил "тупняки" с тем, что не получается воспроизвести выполнение долгого запроса непосредственно через SQL. Время выполнения запроса в 1С и в PGAdmin разное, но так же не может быть (я пример ниже приведу).

Уважаемые ресурсы также не акцентируют внимание на необходимости дополнительных параметров при построении плана запроса. Например, на сайте Гилёва, посвящённому настройке PostgreSQL, этот вопрос не учтён и указаны рекомендуемые значения переменных, которые потом перезаписываются сервером при соединении.

Посмотрим, что реально происходит при соединении.

Экспериментируем на виртуальной машине под Windows 10, версия платформы 8.3.23.2114, версия СУБД 15.6 от Postgres Pro. Порядок проведения эксперимента:

  • сервер 1С остановлен;
  • подключаем технологический журнал с отбором по событию DBPOSTGRS;
  • запускаем сервер;
  • подключаемся к любой базе (не важно, конфигуратор или предприятие);
  • закрываем 1С;
  • останавливаем службу сервера.
 
 Тут конфиг ТЖ (путь логов поменять на свой)

Открываем папочку с логами, нас интересует лог рабочего процесса rphost_XXXX и смотрим в самом верху команды, которые выполняет сервер 1С при подключении к базе. 

 
 Тут первые строчки собранного лога

Видим, что сервер 1С устанавливает какие-то параметры для текущей сессии на сервере PostgreSQL. Интересно, какие. Информацию о параметрах буду брать с сайта Postgres Pro

SET client_min_messages=error

Переменная client_min_messages управляет минимальным уровнем сообщений, посылаемых клиенту. Допустимые значения DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, LOG, NOTICE, WARNING и ERROR. Каждый из перечисленных уровней включает все идущие после него. Чем дальше в этом списке уровень сообщения, тем меньше сообщений будет посылаться клиенту. По умолчанию используется NOTICE. 
Т.е. в нашем случае с СУБД на сервер 1С будет направляться только информация по ошибкам.

SET lc_messages to 'en_US.UTF-8'

Установка языка сообщений, тут вопросов нет.

SET enable_mergejoin = off

Переменная enable_mergejoin включает или отключает использование планов соединения слиянием. По умолчанию имеет значение on (вкл.).
А вот это важный момент. Дело в том, что у СУБД PostgreSQL есть 3 способа соединения таблиц, они отличаются временем на подготовку и скоростью работы (см. рисунок) и тут 1С берёт и отключает один из способов. При формировании плана запроса нужно обязательно учитывать этот нюанс.

SET escape_string_warning = off

Этот параметр влияет на поведение при использовании экранирующего символа «\». Сервер 1С отключает предупреждение при наличии этого символа в строках.

SET cpu_operator_cost = 0.001

Этот параметр задаёт приблизительную стоимость обработки оператора или функции при выполнении запроса. Не буду углубляться в нюансы работы оптимизатора, но отмечу, что в СУБД PostgreSQL все операции что-то «стоят» и планировщик строит несколько планов и выбирает из них самый «дешевый». Базовой единицей стоимости считается seq_page_cost, т.е. время на чтение одной страницы с диска при последовательном чтении. Соответственно выполнение оператора процессором получается в 1000 раз быстрее, чем последовательное чтение. По умолчанию этот параметр равен 0.0025, т.е. выполнение операций процессором в 400 раз быстрее чтения с диска.
А вот теперь представим ситуацию, вы с помощью параметра log_min_duration_statement протоколируете долгие запросы. И вот найден запрос, вы его выполняете в PGAdmin и получаете совершенно другое время выполнения. В итоге всё списывается на неактуальность статистики, но задача не решается. А причина в том, что планировщик работает не с тем значением стоимости, которая установлена в параметрах сервера, а с другим, в 4 раза меньшим и строит разные планы выполнения с разным временем.

SET client_encoding = 'utf8'

Устанавливается кодировка клиента.

SET lock_timeout = 20000

Хотел написать, что это время ожидания при конфликте взаимоблокировок, которое указывается в настройке базы в конфигураторе, но я не нашёл такого параметра в документации deadlock_timeout есть, а lock_timeout - нет.

Выводы

Для получения корректного плана запроса не забываем дополнять SQL следующими параметрами:

/* Параметры соединения платформы */
SET client_min_messages=error;
SET lc_messages to 'en_US.UTF-8';
SET enable_mergejoin = off;
SET escape_string_warning = off;
SET cpu_operator_cost = 0.001;
set client_encoding = 'utf8';
SET lock_timeout = 20000;
SET track_io_timing = TRUE;

EXPLAIN (ANALYZE, BUFFERS) 
SELECT ...

 

См. также

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    5153    ivanov660    12    

56

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    9278    Evg-Lylyk    61    

44

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    5103    spyke    28    

49

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    7586    vasilev2015    20    

42

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    12447    241    ZAOSTG    82    

115

HighLoad оптимизация Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Принимать, хранить и анализировать показания счетчиков (метрики) в базе 1С? Почему бы нет? Но это решение быстро привело к проблемам с производительностью при попытках построить какую-то более-менее сложную аналитику. Переход на PostgresSQL только временно решил проблему, т.к. количество записей уже исчислялось десятками миллионов и что-то сложное вычислить на таких объемах за разумное время становилось все сложнее. Кое-что уже практически невозможно. А что будет с производительностью через пару лет - представить страшно. Надо что-то предпринимать! В этой статье поделюсь своим первым опытом применения СУБД Clickhouse от Яндекс. Как работает, что может, как на нее планирую (если планирую) переходить, сравнение скорости работы, оценка производительности через пару лет, пример работы из 1С. Все это приправлено текстами запросов, кодом, алгоритмами выполненных действий и преподнесено вам для ознакомления в этой статье.

1 стартмани

24.01.2024    5678    glassman    18    

40

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    14085    doom2good    49    

71
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. capitan 2507 27.08.24 11:15 Сейчас в теме
Отличная статья.
Спасибо
Плюсую)
2. user865160 28.08.24 10:09 Сейчас в теме
В курсе 1С:Эксперт это есть.
3. gzharkoj 520 28.08.24 11:24 Сейчас в теме
Ну почему же на ИТС описано плохо, вполне все ясно, понятно, другое дело с версиями платформы и настройки самой инф. базы может что-то меняться и тут надо самим через ТЖ получить эту информацию.
4. gzharkoj 520 28.08.24 11:44 Сейчас в теме
https://www.postgresql.org/docs/current/runtime-config-client.html
lock_timeout - Задаёт максимальную длительность ожидания (в миллисекундах) любым оператором получения блокировки таблицы, индекса, строки или другого объекта базы данных. Если ожидание не закончилось за указанное время, оператор прерывается.

Ставится из параметров инф. базы, по смыслу то же самое, что и время ожидания освобождения управляемой блокировки в 1С, по истечению которой генерируется событие ttimeout
5. soulner 461 28.08.24 18:32 Сейчас в теме
(4) Спасибо, что-то я проглядел описание
6. s22 22 29.08.24 17:00 Сейчас в теме
не в 4 раза меньше,а в 2,5 раза больше
7. brr 184 29.08.24 17:49 Сейчас в теме
Есть плагин для постге позволяющий добавлять хинты в запросы 1С https://github.com/dobpilot/planhint-1c
8. s22 22 30.08.24 08:27 Сейчас в теме
Кроме того выплеснули случай когда mergejoin идёт по индексам
9. Venberg 01.09.24 22:59 Сейчас в теме
Эта информация так же доступна в документации к Tantor.
Смотрите в конце страницы.
Оставьте свое сообщение