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 в продуктивной среде. Подробнее в статье Сжатие данных.

  • Доработан алгоритм использования статистики для составных индексов: добавлен параметр enable_multicolumn_stats_detail, включающий сбор префиксных гистограмм для многоколоночных btree-индексов при ANALYZE.

  • Реализована работа баз 1С с Tantor SE без использования прав суперпользователя.

  • Дополнительно оптимизировано выполнение запросов с оператором LIKE для типов mchar и mvarchar. Повышена производительность поиска по префиксу и поиска подстроки, в случаях поиска по префиксу планировщик может использовать индекс.

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. Теперь он включает детализированные метрики стоимости, статистику по узлам плана и пояснения к ключевым решениям планировщика. Это позволяет быстрее диагностировать причины выбора неоптимальных планов выполнения. Подробнее в статье Доработка вывода EXPLAIN.

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

  • Добавлен параметр cardinality_estimation. Он позволяет переключиться на модель оценки кардинальности “Частично независимая” (partially correlated), которая учитывает корреляцию между полями и значительно точнее оценивает количество строк в сложных многотабличных запросах. Именно такая архитектура характерна для баз 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 итеративно определяет возможные значения пропущенного поля и переиспользует индекс для точечного поиска, что на реальных запросах к регистрам накопления даёт ускорение на порядки. Это особенно критично для многопользовательских баз с разделением данных. Подробнее в статье Ускорение поиска Index Scan.

  • Добавлена оптимизация запросов с конструкциями ORDER BY и LIMIT, с помощью параметра enable_sort_pushdown. Она позволяет выполнять сортировку до внешних соединений в случаях, когда это снижает стоимость выполнения запроса и повышает производительность.

  • Реализована управляемая параметром enable_semijoin_relocation оптимизация, которая перемещает преобразованные планировщиком SEMI/ANTI-соединения ближе к отношениям, на которые они ссылаются. Это позволяет раньше применять фильтры подзапросов, сокращать объём обрабатываемых данных и выбирать более эффективный план выполнения.

  • Реализована управляемая параметром enable_nestloop_onetime_filter оптимизация, которая за счет применения умных фильтров позволяет выполнять цикл Nested Loop меньшее количество раз.

  • С помощью параметра enable_hashjoin_bloom реализована поддержка bloom-фильтров, позволяющая ускорить выполнение запросов, в которых идет соединение таблиц с большим количеством записей. Подробнее в статье Как фильтр Блума ускоряет JOIN'ы в PostgreSQL.

  • Исправлена ошибка планировщика запросов, из-за которой использование COALESCE в условиях соединения могло приводить к завышенной оценке стоимости Hash Join и выбору менее эффективного плана выполнения.

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

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 прямо на работающей высоконагруженной системе без перезапуска сервера.