При администрировании высоконагруженных и объемных баз 1С (от 1 ТБ и выше) на СУБД Microsoft SQL Server часто возникает вопрос оптимизации параллельной работы пользователей. Классическая проблема ожиданий на блокировках, когда читатели ждут писателей (ожидания типа LCK_M_S), может существенно замедлять работу формируемых отчетов и проведение документов. Разберем, как именно функционирует версионный режим READ_COMMITTED_SNAPSHOT (RCSI), в каких случаях платформа 1С включает его самостоятельно и как предотвратить проблемы с переполнением tempdb.
Исторически в методических материалах по 1С встречалось предостережение против включения версионных уровней изоляции. Однако это ограничение относилось к конфигурациям, работающим в режиме автоматических блокировок. При автоматическом режиме 1С полностью полагается на уровни изоляции самой СУБД, и использование версионника может приводить к ошибкам неповторяющегося чтения транзакций.
В современных конфигурациях используется управляемый режим блокировок. Начиная с версии платформы 8.3.1 (при режиме совместимости с версией 8.2.16 и выше), платформа 1С:Предприятие при работе с Microsoft SQL Server 2005 и выше автоматически использует уровень изоляции транзакций READ_COMMITTED_SNAPSHOT. При чтении данных вне транзакций применяется согласованное чтение.
Таким образом, логические блокировки платформа накладывает самостоятельно через собственный менеджер блокировок, а на уровне СУБД читатели больше не блокируются пишущими транзакциями.
Чтобы точно узнать, включен ли режим версионирования строк в конкретной базе данных, выполним диагностический T-SQL запрос к системному представлению sys.databases:
SELECT
name,
is_read_committed_snapshot_on,
snapshot_isolation_state_desc
FROM sys.databases
WHERE name = DB_NAME();
Значение 1 в поле is_read_committed_snapshot_on подтверждает, что для текущей базы данных активирован механизм RCSI.
При активном RCSI каждая операция модификации данных сохраняет предыдущие версии строк в системной базе данных tempdb (в хранилище Version Store). Это создает определенные риски при высокой интенсивности изменений:
Version Store Cleanup не может удалить ни одну версию строки, созданную после старта самой старой активной транзакции на сервере. Если регламентное задание, отчет или фоновый процесс удерживают открытую транзакцию часами, версионник в tempdb непрерывно растет, что может приводить к ошибке переполнения диска (ошибка 9002).page splits) и увеличивать фрагментацию индексов.Для надежной работы 1С с версионным режимом на больших объемах данных настроим окружение базы данных:
tempdb на отдельном высокоскоростном NVMe-накопителе. Для баз объемом в несколько терабайт с активным параллельным перепроведением документов под tempdb рекомендуется резервировать от 15–20% объема рабочей базы.FILLFACTOR) на уровне 85–90% для наиболее активных таблиц.tempdb непосредственно в саму базу данных. Это изолирует нагрузку и предотвращает падение всего экземпляра из-за разрастания системного tempdb.Для оперативного контроля состояния хранилища версий и поиска зависших транзакций выполним анализ следующих представлений СУБД:
sys.dm_db_file_space_usage (столбец version_store_reserved_page_count).sys.dm_tran_active_snapshot_database_transactions позволяет вычислить сессию с минимальным номером transaction_sequence_num, блокирующую автоматическую очистку.sys.dm_tran_top_version_generators наглядно показывает таблицы базы 1С, которые генерируют максимальный поток версий.