УНИЧТОЖИТЬ в конце пакета: временная таблица всё это время лежала в tempdb

20.08.26

База данных - HighLoad оптимизация

В длинных пакетных запросах временные таблицы живут до конца пакета: УНИЧТОЖИТЬ либо забывают, либо сваливают в конец. Обработка анализирует пакет и расставляет УНИЧТОЖИТЬ ровно там, где каждая таблица использована в последний раз — tempdb освобождается раньше. Только текст запроса, к СУБД не обращается.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Авто-УНИЧТОЖИТЬ: оптимизатор временных таблиц в пакетных запросах
.epf 10,42Kb ver:1
1 6 200 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

В длинных пакетных запросах временные таблицы обычно живут до самого конца пакета: УНИЧТОЖИТЬ либо забывают, либо сваливают все в конец «для порядка». Всё это время СУБД держит таблицы в tempdb - на тяжёлых отчётах это лишние гигабайты и лишние секунды. Обработка анализирует пакет и расставляет УНИЧТОЖИТЬ ровно там, где каждая временная таблица использована в последний раз.

 

Что делает

  • Разбирает пакетный запрос: находит все временные таблицы (ПОМЕСТИТЬ/INTO) и место последнего использования каждой.
  • Показывает отчёт: где создана, где последний раз использована, был ли УНИЧТОЖИТЬ в исходном тексте.
  • Генерирует оптимизированный текст: УНИЧТОЖИТЬ вставлен сразу после последнего использования; существующие УНИЧТОЖИТЬ переставляются на правильные места (повторный прогон ничего не дублирует).
  • Таблицы, живущие до последнего пакета, не трогает - менеджер временных таблиц закроется сам, о чём честно пишет в отчёте.

 

Что учтено в разборе

  • Комментарии // и строковые литералы: упоминание таблицы в комментарии или строке использованием не считается.
  • Поиск имени по границам слова: ВТ_Товары и ВТ_Товары2 не путаются.
  • Регистронезависимость и англоязычный синтаксис (SELECT … INTO, DROP).
  • Вложенные подзапросы «В (ВЫБРАТЬ …)» считаются использованием.

 

Принцип безопасности

Обработка работает только с текстом запроса: к данным, метаданным и СУБД не обращается. Открыли - вставили текст - получили оптимизированный вариант и отчёт.

 

Зачем это вам

Из практики оптимизации больших баз: в типовом «отчёте на 15 пакетов» половина временных таблиц не уничтожается вовсе, а вторая половина - одним блоком в конце. На базах в сотни гигабайт это заметная нагрузка на tempdb при каждом запуске отчёта. Расстановка УНИЧТОЖИТЬ по месту последнего использования - самая дешёвая оптимизация пакетного запроса: ничего не переписывается, план не меняется, память освобождается раньше.

 

Совместимость

1С:Предприятие 8.3, управляемые формы, любая конфигурация (обработка не зависит от метаданных). Код открыт.

 

Что в файле

Внешняя обработка .epf. Вставили пакетный запрос - нажали «Расставить УНИЧТОЖИТЬ» - забрали оптимизированный текст и отчёт по каждой временной таблице.

 

Другие наши инструменты диагностики 1С

Эта обработка отвечает на один вопрос: как переписать пакетный запрос, чтобы временные таблицы не жили дольше нужного. Соседние вопросы закрывают остальные.

Производительность и объём:

Код и переезд:

Порядок разбора обычно такой: сначала смотрим, из чего база и как она стоит на сервере, потом спускаемся к конкретному запросу.

Проверено на следующих конфигурациях и релизах:

  • Розница, редакция 2.3, релизы 2.2.6.18

Вступайте в нашу телеграмм-группу Инфостарт

Обработка оптимизирует запросы генерирует Уничтожить ВТ в тексте запроса

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    273695    1523    422    

1185

Инструментарий разработчика Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

QueryConsole1C — расширение, включающее консоль запросов с поддержкой исполняемых представлений — аналогов виртуальных таблиц, основанных на методах программного интерфейса ЗУП. Оно позволяет выполнять запросы с учётом встроенной бизнес-логики, отлаживать алгоритмы получения данных и автоматически генерировать код на встроенном языке 1С.

1 стартмани

16.05.2025    12615    158    zup_dev    32    

86

Запросы Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    22722    XilDen    39    

113

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    46623    doom2good    50    

80

HighLoad оптимизация Системный администратор Программист Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    24733    ivanov660    7    

84

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    14220    a.doroshkevich    23    

78

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    28283    skovpin_sa    15    

107
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Smartpk 9 05.08.26 08:58 Сейчас в теме
Просится общий модуль, куда можно кодом отправить объект "Запрос" для автоматической корректировки его текста
6. nedomolkov.ivan 152 06.08.26 07:28 Сейчас в теме
(1) Готово: добавил экспортную функцию, как и обсуждали — на входе текст запроса, на выходе исправленный, без отчёта. Назвал короче: ОптимизироватьЗапрос (в примере выше я писал ОптимизироватьТекстЗапроса — в файле оставил короткое имя). Вызов из кода: Опт = ВнешниеОбработки.Создать(ПутьКФайлу); НовыйТекст = Опт.ОптимизироватьЗапрос(ТекстЗапроса); Обновление 1.1 отправил — файл появится после модерации. Спасибо за идею и за обсуждение!
2. nedomolkov.ivan 152 05.08.26 11:20 Сейчас в теме
(1) Идея по адресу: внутри вся логика и так чистая функция «текст на входе — текст на выходе», форма только обёртка над ней. Вынести в общий модуль — это по сути один экспорт.

Единственное, где я бы разделил два режима, и это не придирка. Первый — ОптимизироватьТекстЗапроса(Текст): безопасен всегда, ничего не знает о контексте, годится хоть в обработке разработчика, хоть в тестах. Второй — обёртка над объектом Запрос, которая правит Запрос.Текст перед Выполнить(). Она удобнее, но у неё есть цена: в отладчике и в технологическом журнале вы будете видеть один текст, а исполняться будет другой. На разборе инцидента через полгода это стоит нервов, поэтому такой режим должен включаться осознанно, а не быть поведением по умолчанию.

Второе уточнение по смыслу: выигрыш от УНИЧТОЖИТЬ по месту последнего использования проявляется на длинных пакетах и живущем менеджере временных таблиц — то есть там, где таблица иначе доживёт до конца всего пакета, занимая tempdb. На коротком пакете из двух-трёх ВТ разница в пределах шума, и честнее это сказать, чем продавать эффект везде.

Оба варианта заложу в следующую версию. Встречный вопрос, чтобы сделать сразу как надо: вам нужен от функции только исправленный текст или ещё и отчёт об изменениях структурой — что переставлено и куда, — чтобы можно было залогировать правку?
3. Smartpk 9 05.08.26 12:08 Сейчас в теме
(2)
вам нужен от функции только исправленный текст или ещё и отчёт об изменениях структурой — что переставлено и куда, — чтобы можно было залогировать правку?

Добавление "УНИЧТОЖИТЬ" настолько незначительно правит запрос, что отчет будет излишним. Ну это на мой дилетанский взгляд=)
4. nedomolkov.ivan 152 05.08.26 13:55 Сейчас в теме
(3) Согласен, отчёт тут был бы избыточен: правка точечная, и городить структуру ради одного «УНИЧТОЖИТЬ» смысла нет. Спасибо, что ответили — это ровно тот случай, когда чужой взгляд экономит лишний слой в коде.

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

И «дилетантский взгляд» тут ни при чём. Вы предложили ровно то, до чего доходят, когда инструментом пользуются, а не разглядывают со стороны.
5. Smartpk 9 05.08.26 14:17 Сейчас в теме
7. WarAn 08.08.26 21:23 Сейчас в теме
Извините, но крайне сомнительна полезность этого алгоритма. Вообще
8. nedomolkov.ivan 152 08.08.26 21:28 Сейчас в теме
(7)
Могу рассказать реальный кейс, мне дали задачу оптимизировать чужой запрос, 56 виртуальных таблиц, каскадное ценообразование по правилам, я запрос через него пропустил и за 2 минуты тот же запрос выполнился на 20% быстрее.
Для отправки сообщения требуется регистрация/авторизация