Переход на новое серверное оборудование — это отличный повод пересмотреть архитектуру всей системы и обновить программное обеспечение. Если ваша система автоматизации 1С длительное время работала под управлением СУБД MS SQL Server 2012, то при переезде на новое «железо» неизбежно возникнет дилемма: остаться на проверенной временем версии или установить более современный релиз. С момента выпуска версии 2012 года корпорация Microsoft выпустила целый ряд обновлений СУБД: SQL Server 2014, 2016, 2019 и 2022. Разберем по шагам, какую версию выбрать, какие технические нюансы необходимо учесть и как правильно настроить современную СУБД для обеспечения максимального быстродействия платформы 1С:Предприятие.
В кругах администраторов баз данных часто можно услышать мнение, что старые версии СУБД (такие как SQL Server 2008 R2 или 2012) работают быстрее и стабильнее новых решений, а переход, например, на SQL Server 2014 приводил к резкому падению производительности. Давайте проанализируем, почему возникал такой эффект и как обстоят дела на самом деле.
Начиная с версии SQL Server 2014, Microsoft внедрила принципиально новый алгоритм оценки кардинальности — Cardinality Estimator (CE). Этот компонент отвечает за оценку количества строк, которые будут возвращены каждым оператором в плане выполнения запроса. Новый оптимизатор отлично показывает себя в аналитических системах (OLAP) со сложными многомерными выборками. Однако для транзакционных нагрузок (OLTP), к которым относится и 1С, новый алгоритм часто строит неоптимальные планы выполнения из-за специфической структуры метаданных и обилия временных таблиц.
В результате сложные запросы 1С (например, при проведении документов или расчете себестоимости в 1С:Комплексная автоматизация) начинали выполняться в разы медленнее. Решается эта проблема очень просто. При переходе на современные версии SQL Server (2016, 2019 или 2022) мы можем использовать все системные преимущества новой СУБД, но при этом принудительно заставить оптимизатор использовать старый, проверенный и стабильный алгоритм оценки для базы данных 1С. Для этого в свойствах базы данных необходимо включить параметр Legacy Cardinality Estimator или использовать глобальный флаг трассировки 9481.
Если версия 2012 года требовала от системного администратора ручной настройки множества параметров и флагов трассировки для оптимизации работы с временными таблицами, то в SQL Server 2016 ключевые механизмы были переработаны на уровне ядра СУБД. Рассмотрим подробнее, какие улучшения критически важны для систем на платформе 1С:
tempdb:
tempdb происходит одновременно для всех файлов (опция AUTOGROW_ALL_FILES активна по умолчанию). Больше нет необходимости вручную прописывать флаг трассировки 1117. Это предотвращает дисбаланс в распределении данных по файлам на диске.1118.Рассматривая современные варианты для перехода, стоит обратить внимание на более актуальные версии СУБД, которые привносят инновационные механизмы автоматического самообучения и оптимизации планов запросов.
Query Store (Хранилище запросов): Данная технология появилась в SQL 2016, а в SQL Server 2022 она активирована по умолчанию для всех новых баз данных. Для администратора 1С это незаменимый инструмент. Он позволяет записывать историю выполнения всех запросов, фиксировать время их работы и потребление ресурсов. Если после обновления конфигурации или платформы какой-то отчет внезапно начал тормозить, с помощью Query Store мы можем в пару кликов увидеть регрессию плана выполнения и принудительно зафиксировать старый («быстрый») план без изменения программного кода 1С.
Оптимизация чувствительных к параметрам планов (PSP - Parameter Sensitive Plan): В SQL Server 2022 была решена классическая проблема под названием Parameter Sniffing (параметрическая чувствительность). Суть проблемы заключается в том, что СУБД строит план выполнения запроса на основе первого переданного параметра. Если первый пользователь сформировал отчет по небольшой организации, СУБД построит быстрый план с использованием поиска по индексам. Если затем второй пользователь запустит этот же отчет по огромному холдингу, СУБД применит тот же кэшированный план, что приведет к катастрофическому зависанию сервера. Технология PSP в SQL Server 2022 умеет кэшировать несколько различных планов для одного и того же запроса, автоматически выбирая оптимальный в зависимости от объема передаваемых данных.
Memory-Optimized TempDB Metadata: В версиях 2019 и 2022 появилась возможность перенести метаданные системной базы tempdb в оперативную память (In-Memory OLTP). Это полностью решает проблему задержек (latch contention) на системных страницах распределения пространства при одновременной работе сотен активных сессий пользователей 1С.
Планируя переход на самую современную версию SQL Server 2022, необходимо учитывать важное архитектурное изменение. Корпорация Microsoft полностью исключила компонент SQL Server Native Client (SNAC) из состава дистрибутива СУБД и среды администрирования SSMS 19.
Традиционно сервер приложений 1С:Предприятия использовал именно Native Client для подключения к СУБД, если они физически находились на разных серверах. При установке SQL Server 2022 на чистую операционную систему подключить базу 1С привычным способом не удастся — платформа выдаст ошибку отсутствия провайдера данных. Чтобы решить эту проблему, выполним следующие шаги:
Давайте разберем по шагам, какие настройки СУБД необходимо выполнить сразу после переноса базы данных 1С на новую версию SQL Server (например, 2019 или 2022), чтобы избежать падения производительности.
После восстановления базы данных из резервной копии на новом сервере обязательно обновим уровень совместимости и настроим параметры оптимизатора. Выполним следующий скрипт в среде SQL Server Management Studio (SSMS):
-- Устанавливаем уровень совместимости (например, 150 для SQL Server 2019)
ALTER DATABASE [Имя_Вашей_Базы_1С]
SET COMPATIBILITY_LEVEL = 150;
GO
-- Включаем устаревший оптимизатор оценки кардинальности для стабильной работы 1С
ALTER DATABASE SCOPED CONFIGURATION
SET LEGACY_CARDINALITY_ESTIMATOR = ON;
GO
-- Включаем автоматическое обновление статистик асинхронно
ALTER DATABASE [Имя_Вашей_Базы_1С]
SET AUTO_UPDATE_STATISTICS_ASYNC ON;
GO
По умолчанию SQL Server настроен так, чтобы забирать под свои нужды всю доступную оперативную память на сервере. Если сервер приложений 1С и SQL Server установлены на одной физической машине (схема «все в одном»), это неизбежно приведет к тому, что процессам 1С (rphost) не хватит памяти, и операционная система уйдет в жесткий свопинг на диск.
Проанализируем доступные ресурсы сервера и ограничим параметр Max Server Memory. Расчет выполним по следующей формуле:
[Максимальный объем памяти для SQL] = [Всего RAM на сервере] - [4 ГБ для ОС] - [1.5 ГБ * Количество рабочих процессов rphost]
Для настройки лимита выполним системный запрос:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
EXEC sp_configure 'max server memory (MB)', 49152; -- Например, ограничим 48 ГБ
RECONFIGURE;
GO
По умолчанию значение этого параметра равно 0 (автоматический выбор), что на практике часто ограничивает СУБД диапазоном в 255–512 потоков. При интенсивной многопользовательской работе в 1С:Комплексная автоматизация этого объема может не хватать, что приводит к ожиданиям на стороне SQL Server. Опытным путем доказано, что установка фиксированного значения в 2048 рабочих потоков гарантирует стабильную параллельную обработку запросов пользователей без лишних задержек:
EXEC sp_configure 'max worker threads', 2048;
RECONFIGURE;
GO
Обсуждая замену устаревшего SQL Server 2012, нельзя обойти стороной современные тенденции импортозамещения и оптимизации затрат на лицензирование. Свободно распространяемая СУБД PostgreSQL (а именно ее специализированные сборки под 1С, такие как Postgres Pro) сделала колоссальный шаг вперед в плане производительности.
На сегодняшний день при использовании современных быстрых NVMe SSD-накопителей и правильной тонкой настройке параметров конфигурационного файла postgresql.conf (таких параметров, как shared_buffers, work_mem, maintenance_work_mem и effective_cache_size) СУБД PostgreSQL обеспечивает производительность операций в 1С, практически не уступающую коммерческим продуктам от Microsoft. Это делает ее отличным выбором для средних и крупных внедрений 1С, позволяя значительно сэкономить на лицензиях SQL Server Enterprise.
Подводя итог нашему анализу, сформулируем ключевые рекомендации для успешного перехода с SQL Server 2012 на новое серверное оборудование:
LEGACY_CARDINALITY_ESTIMATOR = ON.MSOLEDBSQL.