Проблема низкой производительности 1С:Предприятие при работе с MS SQL Server является одной из самых актуальных для крупных внедрений. Часто стандартной установки компонентов недостаточно для обеспечения стабильной и быстрой работы системы. В этой статье мы подробно разберем, как правильно настроить серверную часть, чтобы минимизировать задержки и исключить «зависания» системы при выполнении тяжелых операций.
Одной из наиболее распространенных ошибок является использование настроек памяти «по умолчанию». Проанализируем, как SQL Server взаимодействует с оперативной памятью. По умолчанию сервер пытается захватить всю доступную память, что может привести к «голоданию» операционной системы и самого сервера приложений 1С, если он установлен на той же машине.
Разберем процесс настройки лимитов. Нам необходимо ограничить Max Server Memory, чтобы оставить системе и сторонним процессам около 10–15% объема ОЗУ (но не менее 4–8 ГБ). Это предотвратит чрезмерный свопинг (использование файла подкачки), который катастрофически замедляет работу.
Для изменения настроек выполним следующий скрипт в SQL Server Management Studio (SSMS):
EXEC sys.sp_configure N'show advanced options', N'1';
RECONFIGURE;
EXEC sys.sp_configure N'max server memory (MB)', N'61440'; -- Укажите свое значение в МБ
RECONFIGURE;
Рассмотрим также параметр Lock Pages in Memory. Эта настройка Windows позволяет SQL Server удерживать данные в физической памяти, предотвращая их выгрузку в виртуальную память. Мы рекомендуем включать эту опцию для учетной записи, под которой запущен сервис SQL Server, через оснастку «Локальная политика безопасности».
База TempDB используется 1С чрезвычайно интенсивно: в ней создаются все временные таблицы, выполняются сортировки и хранятся версии строк при использовании определенных уровней изоляции. Если TempDB настроена неправильно, она становится «бутылочным горлышком» всей системы.
Посмотрим на основные рекомендации по настройке TempDB:
TempDB должны иметь строго одинаковый начальный размер и одинаковый шаг авторасширения. Разберем почему: SQL Server использует алгоритм пропорционального заполнения, и если файлы будут разного размера, нагрузка распределится неравномерно.TempDB на самый быстрый доступный диск (NVMe или SSD), учитывая размер таблицы SQL базы 1С.Проанализируем пример скрипта для переноса и настройки файлов TempDB:
USE master;
GO
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'F:\SQL_Data\tempdb.mdf', SIZE = 1024MB, FILEGROWTH = 256MB);
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'F:\SQL_Logs\templog.ldf', SIZE = 512MB, FILEGROWTH = 128MB);
-- Добавление дополнительных файлов
ALTER DATABASE tempdb ADD FILE (NAME = tempdev2, FILENAME = 'F:\SQL_Data\tempdb_2.ndf', SIZE = 1024MB, FILEGROWTH = 256MB);
GO
Параметр Max Degree of Parallelism (MAXDOP) определяет количество процессоров, используемых для выполнения одного запроса. Для 1С:Предприятие установка этого параметра в значение «0» (использовать все ядра) часто приводит к возникновению взаимных блокировок и деградации производительности.
Разберем рекомендации фирмы 1С и практический опыт. В большинстве случаев оптимальным значением является MAXDOP = 1. Это заставляет каждый запрос выполняться на одном ядре, что исключает накладные расходы на синхронизацию потоков внутри SQL Server. В некоторых случаях на современных многоядерных системах можно устанавливать значения 2 или 4, но это требует тщательного тестирования.
Также важно настроить Cost Threshold for Parallelism. По умолчанию это значение равно 5, что слишком мало для современных систем. Рекомендуется увеличить его до 50, чтобы SQL Server не пытался распараллеливать «дешевые» запросы.
Без актуальной статистики оптимизатор SQL Server может построить неэффективный план выполнения запроса, что приведет к чтению миллионов лишних строк. Выясним, какие операции обслуживания должны выполняться обязательно.
Обновление статистики: В 1С таблицы постоянно меняются. Мы рекомендуем обновлять статистику ежедневно, а для наиболее нагруженных баз — несколько раз в день. Используйте команду UPDATE STATISTICS с параметром FULLSCAN для наиболее важных таблиц.
Дефрагментация индексов: Со временем индексы фрагментируются, что замедляет операции поиска и сканирования. Мы должны настроить план обслуживания, который будет выполнять REORGANIZE (если фрагментация 5–30%) или REBUILD (если фрагментация более 30%). Для автоматизации этого процесса подойдёт скрипт регламентного обслуживания индексов для 1С на базе MaintenanceSolution.
Рассмотрим пример кода для обновления статистики во всей базе данных:
EXEC sp_msforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN';
Перейдем к прикладной части. Проанализируем, как код 1С влияет на работу SQL Server. В системе 1С 8.3 используются управляемые блокировки. Это означает, что разработчик сам управляет тем, какие ресурсы будут заблокированы в транзакции.
Для минимизации блокировок мы должны соблюдать следующие правила:
Записать() или НачатьТранзакцию()).БлокировкаДанных. Разберем пример: если мы читаем данные из регистра накопления для проверки остатков, нам нужно явно заблокировать нужные измерения.Посмотрим на пример кода 1С для установки управляемой блокировки:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.УстановитьЗначение("Склад", ВыбранныйСклад);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Такой подход гарантирует, что SQL Server не будет накладывать избыточные блокировки на всю таблицу, а заблокирует только нужный нам разрез данных по конкретному складу.
Рассмотрим типичные ошибки в запросах, которые «убивают» производительность SQL Server. Самая частая проблема — это использование подзапросов в условии ГДЕ или соединение с подзапросами. SQL Server не всегда может эффективно оптимизировать такие конструкции.
Вместо использования подзапросов, мы должны использовать Временные Таблицы. Выясним почему: временные таблицы индексируются (если указать индексацию), и оптимизатор SQL Server получает точную статистику по ним, что позволяет построить идеальный план соединения.
Сравним два подхода. Плохой вариант — использование вложенного запроса в соединении. Хороший вариант — выгрузка данных во временную таблицу:
// Создание временной таблицы
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ВидНоменклатуры = &Вид;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Остатки.Товар,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки( , Товар В (ВЫБРАТЬ Товар ИЗ ВТ_Товары)) КАК Остатки";
В данном примере мы сначала отфильтровали нужную номенклатуру, сохранили её в ВТ_Товары, и только затем передали этот список в виртуальную таблицу остатков. Это работает значительно быстрее на больших объемах данных.
Мы проанализировали основные технические аспекты, влияющие на скорость работы 1С. Подведем итог: оптимизация — это всегда комплекс мер. Она начинается с аппаратной настройки (SSD, распределение нагрузки по дискам), продолжается тонкой настройкой параметров SQL Server (Memory, MAXDOP, TempDB), закрепляется регламентными работами по обслуживанию индексов и завершается качественным написанием кода запросов в самой 1С. Для комплексного аудита ключевых параметров сервера можно воспользоваться обработкой для автоматического чек-апа СУБД под 1С.
Соблюдение этих правил позволит вам не только ускорить работу пользователей, но и значительно повысить общую стабильность системы, исключив неожиданные блокировки и простои.