Как выполнить выборочную реиндексацию таблиц MS SQL после удаления большого объема данных в 1С?

Системный администратор 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Работа с многотерабайтными базами данных 1С на платформе MS SQL Server накладывает особые требования к регламентным операциям. Одной из самых сложных задач является "подрезка" или свертка базы, когда из системы удаляются данные за несколько лет. После выполнения массового удаления (обычно средствами SQL для экономии времени) база сталкивается с деградацией производительности. Разберем подробно, как правильно привести индексы и статистику в порядок, не прибегая к полному тестированию и исправлению, которое на таких объемах может длиться неделями.

Выясняем причину: что происходит с SQL-таблицей после массового DELETE

Когда мы удаляем миллионы строк из таблиц 1С (например, из регистров накопления или бухгалтерии) с помощью команды DELETE, MS SQL Server не освобождает место на диске мгновенно. Рассмотрим внутренние процессы:

  1. Фантомные записи (Ghost Records): SQL Server помечает строки как удаленные, но физически они остаются в страницах данных. Специальный процесс Ghost Cleanup вычищает их в фоновом режиме, но при терабайтных удалениях он может не справляться оперативно.
  2. Низкая плотность страниц (Page Density): Даже после очистки страницы индекса остаются полупустыми. При выполнении запросов сервер вынужден считывать огромное количество полупустых страниц в оперативную память (Buffer Pool), что резко снижает производительность.
  3. Фрагментация: Массовое удаление часто приводит к логической фрагментации индексов, что делает неэффективным последовательное сканирование (Index Scan).

Проанализируем ситуацию: простое удаление данных не уменьшает размер файлов и не ускоряет работу. Чтобы вернуть производительность, нам необходимо перестроить индексы конкретных таблиц, которые подверглись очистке.

Шаг 1. Определение имен таблиц в MS SQL Server

В 1С имена таблиц в базе данных не совпадают с именами объектов в конфигураторе (например, РегистрНакопления.Продажи может называться _AccumReg123). Для выборочного обслуживания нам нужно получить точное соответствие.

Рассмотрим, как это сделать программно средствами 1С. Для версий 8.1, 8.2 и 8.3 (до появления современных инструментов реструктуризации) наиболее надежным методом является использование встроенной функции:


// Пример получения имени таблицы для конкретного объекта
ТаблицаОбъекта = ПолучитьСтруктуруХраненияБазыДанных("РегистрСведений.ЦеныНоменклатуры");
Для Каждого СтрокаСтруктуры Из ТаблицаОбъекта Цикл
    Сообщить("Имя таблицы в SQL: " + СтрокаСтруктуры.ИмяТаблицыХранения);
КонецЦикла;

Если же вы предпочитаете работать напрямую в SQL Management Studio (SSMS), можно воспользоваться сторонними обработками типа "Структура таблиц" или консолью запросов, которая умеет транслировать метаданные в SQL-имена.

Шаг 2. Перестроение индексов (REBUILD)

Для того чтобы физически переупаковать данные и устранить фрагментацию, используем команду ALTER INDEX REBUILD. В отличие от REORGANIZE, перестроение создает индекс заново, гарантируя максимальную плотность страниц.

Выполним следующую команду для каждой подрезанной таблицы (заменив _InfoRg108454 на ваше имя таблицы):


ALTER INDEX ALL ON _InfoRg108454 
REBUILD WITH (
    SORT_IN_TEMPDB = ON, 
    ONLINE = ON, 
    MAXDOP = 4
);

Разберем параметры этой команды подробнее:

Шаг 3. Обновление статистики

Даже если мы перестроили индекс, оптимизатор запросов SQL Server может продолжать строить неверные планы, так как он "помнит" старое распределение данных (миллионы строк, которых больше нет). Проанализируем, почему это важно: неверная статистика заставляет сервер выбирать Table Scan там, где нужен Index Seek.

Выполним полное обновление статистики для таблицы:

UPDATE STATISTICS _InfoRg108454 WITH FULLSCAN;

Использование WITH FULLSCAN гарантирует 100% точность распределения данных, что критически важно для механизмов итогов 1С. Хотя это занимает больше времени, чем стандартное сканирование, для "подрезанных" таблиц это обязательная процедура.

Шаг 4. Критическая стадия — пересчет итогов в 1С

Это самый важный момент, который часто упускают системные администраторы. Рассмотрим структуру хранения 1С: регистры состоят из таблицы движений (записей) и таблицы итогов (агрегатов на начало каждого месяца). Если вы удалили данные из таблицы движений средствами SQL, таблицы итогов останутся неизменными.

Результат: В отчетах 1С вы увидите неверные остатки (например, товары, которых нет, или долги, которые были удалены). Реиндексация SQL эту проблему не решает.

Необходимо запустить пересчет итогов программно или через Конфигуратор. Проанализируем разницу в методах:

  1. УстановитьПериодРассчитанныхИтогов(НачалоМесяца(ТекущаяДата) - 1) — этот метод сдвигает границу рассчитанных итогов. Если данные удалялись за прошлые периоды, этот метод может быть недостаточным без полной очистки таблиц итогов.
  2. ПересчитатьИтоги() — наиболее надежный, но долгий метод. Он полностью пересчитывает все агрегаты на основании имеющихся движений.

Для оптимизации на больших базах рекомендуется использовать метод ПересчитатьИтогиЗаПериод(), указав период, за который производилось удаление данных.

Дополнительные рекомендации по обслуживанию

Разберем еще несколько нюансов, которые помогут избежать сбоев:

Ловушка SHRINK: Если после удаления данных вы решите выполнить DBCC SHRINKDATABASE, чтобы вернуть место операционной системе, помните: SHRINK вызывает катастрофическую фрагментацию индексов. Если вам нужно сжать файл, всегда соблюдайте порядок: 1. Удаление данных -> 2. SHRINK -> 3. REBUILD индексов. Никогда не делайте наоборот.

Режим восстановления (Recovery Model): Перед массовыми операциями DELETE и REBUILD рекомендуется перевести базу в режим SIMPLE. Это предотвратит неконтролируемый рост лога транзакций (.ldf), который при перестроении терабайтных индексов может превысить объем самой базы данных. После завершения работ верните режим FULL и обязательно сделайте полный бэкап.

Заключение: Выборочная реиндексация — это эффективный инструмент, позволяющий поддерживать производительность огромных баз 1С без остановки системы на многодневное "Тестирование и исправление". Главное — не забывать про связку SQL-команд ALTER INDEX + UPDATE STATISTICS и обязательный пересчет итогов на стороне платформы 1С.

← На главную