4. Улучшения 1C#

4. Улучшения 1C

4. Улучшения 1C #

4.1. Ядро #

  • Решена проблема легких блокировок при большом количестве одновременных подключений к СУБД.

  • Максимальный размер данных в ячейках таблицы, поддерживаемый модулем pg_dump, был увеличен с 1 ГБ до 2 ГБ.

  • Изменены значения параметров, которые при значениях по умолчанию могли приводить к ухудшению производительности 1С.

  • Оптимизирована работа блокировок с временными таблицами:

    • Не устанавливаются блокировки на системных таблицах каталога для записей о временных таблицах.

    • Оптимизация отправки инвалидационных сообщений при работе с временными таблицами путем замены spin lock на барьер памяти.

  • Реализована возможность повышать точность оценки скалярных статистик для таблиц со сложным распределением данных без увеличения параметра default_statistics_target. Подробнее в статье Повышение точности статистики без увеличения default_statistics_target.

  • Реализовано отложенное размещение временных таблиц: СУБД откладывает физическое выделение места на диске до момента фактической необходимости, что существенно снижает нагрузку на подсистему ввода-вывода. Подробнее в статье Уменьшение нагрузки на дисковую подсистему.

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

  • Оптимизирована работа оператора LIKE для типа mchar/mvarchar за счёт использования более эффективных Unicode-функций для простых шаблонов подстрок. Подробнее в статье Ускорение запросов с поиском по подстроке.

  • Оптимизирована работа команды ANALYZE для широких таблиц. Это обеспечивает прирост производительности команды ANALYZE для широких таблиц на порядок. Подробнее в статье Оптимизация расчёта статистики.

  • Введён новый параметр default_statistics_target_temp_tables для управления точностью статистики временных таблиц, что в сочетании с default_statistics_target обеспечивает независимую настройку детализации статистики для постоянных и временных таблиц.

  • Расширена поддержка параллельного выполнения запросов: теперь параллелизм доступен при записи результатов во временные таблицы, а также в запросах, читающих данные из временных таблиц в секции SELECT.

  • Увеличена длина очереди инвалидационных сообщений MAXNUMMESSAGES с 16384 до 32768, что снижает вероятность переполнения буфера и необходимости полной инвалидации кэша при высоких нагрузках с интенсивным созданием временных таблиц.

  • Реализована возможность отключения сбора статистики по временным таблицам в общую хэш-таблицу Tantor Postgres. Это решает проблему блокировок LWLock и деградации производительности при частых операциях с временными таблицами, статистика по которым не критична для работы системы.

4.2. Планировщик #

  • Оптимизировано выполнение запросов, использующих агрегатные функции, за счет изменения порядка полей группировки.

  • Улучшено прогнозирование соединений таблиц с многоколоночными индексами, что позволяет получить более точную оценку количества строк и выбрать оптимальный оператор план запроса.

  • Оптимизировано кеширование временных таблиц за счет уменьшения списка инвалидации.

  • Оптимизированы различные операции со списком колонок, используемых в запросе, для снижения накладных расходов на выполнение запросов и оптимизацию использования памяти.

  • Оптимизировано выполнение запросов путем выделения общих условий для операций OR и AND в выражениях WHERE, с целью ускорения фильтрации на ранних этапах их обработки.

  • Ускорено выполнение запросов, использующих конструкцию В (&МассивЗначений). Подробнее в статье Решение проблемы Values в Postgres.

  • Исправлена ошибка некорректной оценки строк в результате соединения нескольких таблиц, когда из одной таблицы выбиралось 0 строк и на результат соединения накладывались дополнительные условия.

  • Улучшен алгоритм оценки селективности на основе гистограмм для запросов, использующих соединения по нескольким столбцам таблиц.

  • Доработан алгоритм выбора подходящего индекса путем учета селективности каждого рассматриваемого планировщиком индекса. Это позволяет с большей вероятностью задействовать покрывающий все условия индекс, что приводит к более быстрому выполнению запросов и экономии вычислительных ресурсов. Как пример, это позволяет ускорить обновление итогов регистров накопления. Подробнее в статье СУБД Tantor Special Edition 1C: ускоряем обновление итогов регистров накопления.

  • Исправлена ошибка в механизме multicolumn index (функция locate_inner_multicolumn_index), приводившая к выбору неправильного индекса для определения селективности по заданным условиям.

  • Реализована трансформация EXISTS подзапросов в LATERAL SEMI JOIN, которая значительно ускоряет обработку сложных аналитических запросов, использующих механизм ограничения доступа на уровне записей (РЛС) в 1С. Подробнее в статье Ускорение запросов с ограничением доступа на уровне записей (RLS).

  • Реализован механизм Join Predicate Pushdown, который значительно ускоряет обработку сложных аналитических запросов, использующих, как пример, обращение к виртуальным таблицам регистров сведений, накопления, бухгалтерии. Подробнее в статье Ускорение запросов к виртуальным таблицам с помощью Join Predicate Pushdown.

  • Дополнительно оптимизировано выполнение запросов, использующих агрегатные функции, за счет изменения порядка полей при группировке с предварительной операцией сортировки. Подробнее в статье Ускорение аналитических запросов с агрегацией данных.

  • Улучшен алгоритм вычисления селективности для полей в условиях JOIN, благодаря чему увеличение параметра default_statistics_target больше не приводит к росту накладных расходов на этапе планирования запроса.

  • Ускорено выполнение запросов с различными типами сканирования за счет оптимизации порядка применения фильтров: наиболее селективные условия проверяются первыми.

  • Реализована оптимизация для запросов с дизъюнкцией подзапросов (конструкции вида WHERE EXISTS(...) OR EXISTS(...)): планировщик автоматически преобразует их в объединение независимых запросов через UNION ALL с устранением дубликатов, что дает возможность применить индексный доступ к каждому условию отдельно вместо полного сканирования таблицы.

4.3. Модули #

  • Поддержаны логические слоты репликации для механизма копий баз данных в dbcopies_decoding.

  • Ускорена функция SELECT FASTTRUNCATE, предназначенная для усечения временных таблиц в fasttrun. Подробнее в статье Временные таблицы и SELECT FASTTRUNCATE.

  • Ускорено выполнение запросов, использующих временные таблицы, которые были созданы из таблицы значений, переданной в запрос в качестве параметра в online_analyze. Подробнее в статье 1С и СУБД Tantor: история одного внедрения.

  • Реализовано расширение pg_trace, предназначенное для удобного профилирования SQL-запросов согласно установленным условиям сбора трассировки. Подробнее в документации pg_trace и статье pg_trace — трассировщик запросов от компании Тантор Лабс.

  • Реализовано расширение pg_stat_advisor, которое автоматически анализирует планы выполнения запросов и выявляет проблемные места с неточной оценкой планировщика. Расширение предоставляет конкретные рекомендации по созданию расширенной статистики или автоматически её создает, в зависимости от настройки. В некоторых ситуациях это позволяет значительно ускорить работу критически важных запросов без глубокого погружения в их внутреннюю структуру. Подробнее в статье Автоматическое создание статистики.

  • Расширение pg_stat_statements под специфику 1С: оно автоматически нормализует имена временных таблиц, что позволяет собирать более релевантную статистику по однотипным запросам, в которых отличаются только имена временных таблиц. Подробнее в статье Нормализация имен временных таблиц.