Изменено
-
Существенно ускорено удаление данных средствами СУБД на больших базах (MS SQL и PostgreSQL). Ключевая таблица идентификаторов теперь типизирована под тип ссылок 1С и индексируется: для MS SQL —
binary(16) NOT NULL PRIMARY KEY(вместоUNIQUEIDENTIFIERбез индекса), для PostgreSQL —bytea NOT NULL PRIMARY KEY. Это убирает неявное преобразование типов в условиях отбора и позволяет СУБД использовать индексный доступ (seek) по полю-регистратору вместо полного сканирования регистров. На крупных базах фаза удаления сокращается с десятков часов до десятков минут. -
Перед фазой удаления добавлено обновление статистики ключевой таблицы (
UPDATE STATISTICS/ANALYZE) для выбора оптимального плана. -
Для MS SQL убрана единая транзакция (
BEGIN/COMMIT) на весь скрипт: удаление по каждой таблице теперь автокоммитится. Это снимает разрастание журнала транзакций и многочасовой откат при сбое на больших базах. Целостность обеспечивается резервной копией перед операцией и выполнением в монопольном режиме (рекомендуется также временно перевести БД в модель восстановления SIMPLE). -
Таблица идентификаторов теперь временная: для MS SQL — локальная
#IDs(с проверкой черезtempdb..), для PostgreSQL —CREATE TEMP TABLE. Временная таблица изолирована по сессии, поэтому параллельные удаления в одной базе больше не конфликтуют по общей таблице, дополнительно снижается нагрузка на журнал рабочей БД и таблица автоматически очищается по завершении сессии. -
Генерация текста скрипта вынесена в общую функцию
СформироватьТекстСкриптамодуля объекта — раньше она дублировалась в модулях управляемой и обычной форм. Теперь обе формы используют единую логику, что исключает расхождение их поведения.
Исправление ошибок
-
Для MS SQL устранён риск падения скрипта при повторной вставке одного и того же идентификатора: первичный ключ создаётся с
IGNORE_DUP_KEY = ON(аналогON CONFLICT DO NOTHINGв PostgreSQL). Первичная вставка корневых идентификаторов в PostgreSQL также защищенаON CONFLICT DO NOTHING. -
Перед созданием таблицы идентификаторов добавлено её удаление при наличии (
DR OP TABLE IF EXISTS/IF OBJECT_ID(...) DR OP TABLE) — для корректного повторного запуска скрипта после сбоя. -
Восстановлена работа на старых версиях платформы: функция
УбратьВерсиюИзИмениТаблицыпереписана безСтрНайтиПоРегулярномуВыражению(регулярные выражения встроенного языка доступны только с 8.3.23). Раньше на платформах младше 8.3.23 формирование скрипта падало с ошибкой «Метод объекта не обнаружен». Логика разбора имени таблицы (базовое имя без суффикса расширения, с сохранением суффикса_VT) сохранена идентичной. -
Устранено падение скрипта на MS SQL при удалении большого числа корневых объектов: вставка идентификаторов во временную таблицу разбивается на пачки по 1000 строк. Ранее все идентификаторы вставлялись одним конструктором
INSERT … VALUES, а MS SQL допускает не более 1000 строк в одномVALUES(ошибка 10738) — в режиме «Удаление неиспользуемых объектов» на больших базах это приводило к невыполнению скрипта.
Обновление устанавливается на любую версию.
Скачать обновления вы можете на нашем сайте предварительно авторизовавшись, используя Ваш логин и пароль, далее зайти в меню "Техподдержка > Личный кабинет" и скачать необходимые обновления.