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