Настройки самого SQL

Рекомендации

Пам'ять — правило 80%: SQL + 1С процеси + ОС не повинні перевищувати 80% RAM. При перевищенні 1С іде в файл підкачки. Для 185 GB: SQL отримує 95 GB (51%), решта 29% — для 1С сервера і ОС.

MAXDOP = 1 — жорстке правило для будь-якого сервера 1С. Платформа генерує сотні коротких запитів, паралелізм тільки заважає — створює overhead планувальника без виграшу в швидкості.

Cost threshold = 25 — дефолтне значення Microsoft (5) встановлено в 1990-х під залізо того часу. На сучасному сервері запит вартістю 5 виконується за мікросекунди — будувати для нього паралельний план безглуздо. Значення 25 відсікає 95% коротких запитів 1С від непотрібного аналізу паралелізму.

Optimize for ad hoc = 1 — без цього кожен унікальний запит 1С зберігає повний план у plan cache. При 7 базах і сотнях користувачів plan cache засмічується гігабайтами одноразових планів.

Network packet size = 8192 — актуально коли SQL і 1С сервер на одній машині або в одній мережі. Зменшує кількість мережевих пакетів при передачі великих наборів даних — звіти, великі списки документів.

Blocked process threshold = 5 — не впливає на продуктивність, тільки вмикає моніторинг. Без цього параметра неможливо діагностувати блокування в 1С через стандартні інструменти SQL.

Скрипты sql

-- Перевіримо поточний стан
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
SELECT name, value, value_in_use, description
FROM sys.configurations
WHERE name IN (
'max server memory (MB)',
'min server memory (MB)',
'max degree of parallelism',
'cost threshold for parallelism',
'optimize for ad hoc workloads',
'network packet size (B)',
'blocked process threshold (s)'
)
ORDER BY name;

рекомендуемые настройки для каждой базы в SQL

READ_COMMITTED_SNAPSHOT - Усуває блокування між читанням і записом

ALLOW_SNAPSHOT_ISOLATION - Дозволяє 1С використовувати версіонування в транзакціях

AUTO_UPDATE_STATISTICS - Оптимізатор завжди має актуальну статистику

AUTO_CREATE_STATISTICS - Оптимізатор не «вгадує» плани для нових запитів

PAGE_VERIFY CHECKSUM - Захист від тихого пошкодження даних

AUTO_UPDATE_STATISTICS_ASYNC - Вмикаэ асинхонне оновлення статистики без пауз для користувачів

-- ============================================================
-- Поточний стан параметрів для всіх баз 1С
-- ============================================================
SELECT
name AS база,
is_auto_update_stats_on AS auto_update_stats,
is_auto_update_stats_async_on AS auto_update_async,
is_auto_create_stats_on AS auto_create_stats,
snapshot_isolation_state_desc AS snapshot_isolation,
is_read_committed_snapshot_on AS rcsi,
page_verify_option_desc AS page_verify
FROM sys.databases
WHERE database_id > 4
AND state_desc = 'ONLINE'
ORDER BY name;

-- ============================================================
-- Налаштування параметрів для всіх баз 1С
-- Працює на будь-якому сервері (VTAPPVIA або VTSQLMAIN)
-- ============================================================
USE master;
DECLARE @dbname NVARCHAR(128);
DECLARE @sql NVARCHAR(MAX);
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE database_id > 4
AND state_desc = 'ONLINE'
AND name NOT IN ('distribution')
ORDER BY name;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbname;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '>>> Обробляємо базу: ' + @dbname;
-- AUTO_UPDATE_STATISTICS
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET AUTO_UPDATE_STATISTICS ON;';
EXEC sp_executesql @sql;
PRINT ' AUTO_UPDATE_STATISTICS ON';
-- AUTO_UPDATE_STATISTICS_ASYNC
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET AUTO_UPDATE_STATISTICS_ASYNC ON;';
EXEC sp_executesql @sql;
PRINT ' AUTO_UPDATE_STATISTICS_ASYNC ON';
-- AUTO_CREATE_STATISTICS
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET AUTO_CREATE_STATISTICS ON;';
EXEC sp_executesql @sql;
PRINT ' AUTO_CREATE_STATISTICS ON';
-- PAGE_VERIFY CHECKSUM
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET PAGE_VERIFY CHECKSUM;';
EXEC sp_executesql @sql;
PRINT ' PAGE_VERIFY CHECKSUM';
-- ALLOW_SNAPSHOT_ISOLATION
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET ALLOW_SNAPSHOT_ISOLATION ON;';
EXEC sp_executesql @sql;
PRINT ' ALLOW_SNAPSHOT_ISOLATION ON';
-- READ_COMMITTED_SNAPSHOT (потребує SINGLE_USER)
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;';
EXEC sp_executesql @sql;
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET READ_COMMITTED_SNAPSHOT ON;';
EXEC sp_executesql @sql;
SET @sql = 'ALTER DATABASE [' + @dbname + '] SET MULTI_USER;';
EXEC sp_executesql @sql;
PRINT ' READ_COMMITTED_SNAPSHOT ON';
PRINT ' OK';
PRINT '';
FETCH NEXT FROM db_cursor INTO @dbname;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
PRINT '============================================';
PRINT 'Готово. Перевірка поточного стану:';
PRINT '============================================';
-- Фінальна перевірка
SELECT
name AS база,
is_auto_update_stats_on AS auto_update,
is_auto_update_stats_async_on AS auto_async,
is_auto_create_stats_on AS auto_create,
page_verify_option_desc AS page_verify,
snapshot_isolation_state_desc AS snapshot,
is_read_committed_snapshot_on AS rcsi
FROM sys.databases
WHERE database_id > 4
AND state_desc = 'ONLINE'
ORDER BY name;

Полезные ссылки

https://its.1c.ru/db/metod8dev/content/5904/hdoc