Пользователи копии продуктивной базы начали жаловаться на полное падение производительности в 1C:Документообороте на PostgresPro Enterprise + Linux.

С их слов 1С сильно тормозила и это проявлялось везде: при входе в базу, открытии документов, списков, справочников, задач.

При анализе происходящего из консоли администрирования 1С в момент запуска системы видим, что зависание начинается в момент обращения к СУБД.

Поэтому, настраиваем технологический журнал на сбор запросов и его планов большой длительности.

Мы ставим фильтр — запросы длительностью более 10 секунд. И анализируем полученный результат с помощью регулярных выражений.

1. Находим 3 запроса PostgresPro с максимальной длительностью.
2. Посмотрим текст самого длительного запроса PostgresPro.
3. Анализируем план длительного запроса PostgresPro.

Находим 3 запроса PostgresPro с максимальной длительностью.

Для этого:

  • «вырезаем» sed-ом часть тех.журнала с начала стоки: дата, время, номер микросекунды, до длительности события;
  • сортируем результат;
  • получаем 3 верхние строки;
  • «подкрашиваем» событие DBPOSTGRS для наглядности

Результат:

В результате видим, что топ-3 занимают запросы примерно одного порядка длительности. Вполне вероятно, что сами запросы в этой группе повторяются.

Дело в том, что в регулярном выражении не сгруппированы запросы по его тексту/контексту.

Так как мы уже локализовали проблему в отдельной тестовой базе и воспроизводим ее в однопользовательском режиме, то объем нашего журнала не большой, как и количество длительных запросов в нем.

Итак,

Посмотрим текст самого длительного запроса PostgresPro.

Для этого:

  • grep-ом «найдем» запрос по его длительности и «подкрасим»;
  • покажем 55 строк после найденой строки.

Контекст:

Это событие загрузки текущих дел при запуске 1С:Документооборот.

Текст запроса:

В тексте видим характерную для РЛС особенность – добавление условия в конце запроса:

В нашем случае – добавление условия по таблице _InfoRg2219.

Используя метод ПолучитьСтруктуруХраненияБазыДанных() выясняем, что _InfoRg2219 – это РегистрСведений.ДескрипторыДляОбъектов.

Таким образом, если кто-то не знал, делаем вывод, что все настройки прав через дескрипторы реализованы на уровне СУБД также как и РЛС – добавлением условия в запрос.

Анализируем план длительного запроса PostgresPro.

План запроса:

Видим, что реальное время выполнения всего запроса 162 секунды.

При этом производилось сканирование уже знакомого нам _InfoRg2219 РегистрСведений.ДескрипторыДляОбъектов.

На сканирование ушло 423 мс., операция повторялась 385 раз. Что в сумме даёт 162 секунды.

Следовательно, практически все время выполнения запроса было потрачено на сканирование этой таблицы.

А что же индексы? Где индексы?

Обнаруживаем, что для этого регистра в тестовой базе отсутствуют индексы. Поэтому и происходит сканирование основной таблицы.

Надо отметить, что в момент загрузки бэкапа в тестовую базу PostgresPro сообщала о том, что создать индекс не удалось:

О том, что к этому привело – читайте в наших следующих статьях…