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, обеспечивает независимую настройку детализации статистики для постоянных и временных таблиц. Подробнее в статье Default_statistics_target для временных таблиц.

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

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

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

  • Снято последнее ограничение на параллельное выполнение запросов с временными таблицами. Теперь параллелизм применяется непосредственно к узлам плана, читающим из временных таблиц. Благодаря этому на реальных запросах процедуры расчёта себестоимости в 1С ускоряются от 2.3 до 3.4 раз без каких-либо изменений в коде конфигурации.

  • Реализована полноценная поддержка временных таблиц на read-only репликах с помощью параметров enable_temp_memory_catalog и enable_temp_table_on_replica. Это впервые делает механизм копий баз данных 1С практически применимым на PostgreSQL: нагрузочные тесты на несколько тысяч пользователей подтвердили успешное горизонтальное масштабирование с переносом части запросов на реплику без потери производительности. Подробнее в статье Горизонтальное масштабирование 1С: переносим отчёты на реплику без потери производительности.

  • Реализовано нативное сжатие данных непосредственно при записи. Это позволяет сократить размер баз 1С в 5–10 раз. В отличие от решений, требующих фоновых воркеров и периодической дефрагментации, сжатие происходит inline без накопления фрагментации и без постоянного дополнительного оверхеда на CPU и I/O в продуктивной среде.

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 больше не приводит к росту накладных расходов на этапе планирования запроса. Подробнее в статье Ускорение планирования запросов при высоких значениях default_statistics_target.

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

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

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

  • Реализован новый параметр cpu_filter_cost. Он позволяет более точно настраивать модель стоимости планировщика и автоматически избегать неэффективных планов Nested Loop, которые создают избыточные операции "Rows Removed by Filter". Это критичная оптимизация для типичных запросов 1С с множественными соединениями таблиц и высокой селективностью фильтров.

  • Параметр cardinality_estimation был добавлен. Он позволяет переключиться на модель оценки кардинальности Частично скоррелированная, которая учитывает корреляцию между полями и значительно точнее оценивает количество строк в сложных многотабличных запросах. Такая архитектура типична для баз данных 1С, где зависимые поля и составные связи традиционно вводили планировщик в заблуждение, приводя к неоптимальным планам выполнения.

  • Устранена проблема квадратичной сложности O(N×M) при планировании запросов с конструкцией WHERE field IN [...]. Теперь вместо перебора всех значений MCV-списка против каждого элемента входного массива применяется хэш-соединение с итоговой сложностью O(N+M). Это сокращает время планирования таких запросов в 1С до 100 раз, что особенно ощутимо на больших базах с высокими значениями default_statistics_target.

  • Реализована оптимизация планировщика на основе предагрегации (pre-aggregation) данных до выполнения соединения таблиц. Теперь вместо классической схемы Join→Aggregate планировщик способен автоматически применять схему Aggregate→Join, что сокращает промежуточный набор строк на порядки. На реальных аналитических запросах 1С (закрытие месяца, расчёт себестоимости) это обеспечивает ускорение выполнения до 50 раз без каких-либо изменений в коде конфигурации.

  • Реализована технология Index Skip Scan. Она решает типичную для 1С проблему полного сканирования составного индекса при пропущенном промежуточном поле в условии запроса. Теперь Executor итеративно определяет возможные значения пропущенного поля и переиспользует индекс для точечного поиска, что на реальных запросах к регистрам накопления даёт ускорение на порядки. Это особенно критично для многопользовательских баз с разделением данных.

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С: оно автоматически нормализует имена временных таблиц, что позволяет собирать более релевантную статистику по однотипным запросам, в которых отличаются только имена временных таблиц. Подробнее в статье Нормализация имен временных таблиц.

  • Добавлено расширение auto_dump, которое автоматически сохраняет полный контекст проблемного запроса - включая DDL и данные временных таблиц - в набор готовых SQL-файлов. Это позволяет воспроизвести любой запрос из 1С в psql тремя командами без каких-либо действий в интерфейсе платформы и кратно ускоряет диагностику неоптимальных планов и ошибок СУБД в продуктивной среде.

  • Реализовано расширение pg_sample_profile, которое позволяет профилировать события ожидания Tantor SE-1C прямо на работающей высоконагруженной системе без перезапуска сервера.