При анализе технологического журнала или трассировки SQL Server разработчики часто сталкиваются с ситуацией, когда платформа 1С выполняет инструкцию INSERT INTO для временной таблицы (например, #tt1), но при этом в логах отсутствует предшествующая ей команда CREATE TABLE. На первый взгляд это может показаться ошибкой или странным поведением системы. Однако на самом деле мы имеем дело с глубоко продуманным механизмом оптимизации работы с СУБД. В этой статье мы подробно разберем, как именно платформа управляет временными объектами и почему повторное использование таблиц критически важно для производительности.
Давайте проанализируем, что происходит на уровне взаимодействия между сервером приложений 1С и SQL Server. Платформа 1С стремится минимизировать количество операций с метаданными. Создание (CREATE TABLE) и удаление (DROP TABLE) объектов — это тяжелые операции для СУБД, так как они требуют внесения изменений в системные таблицы базы данных tempdb и вызывают блокировки системного каталога.
Для оптимизации этого процесса платформа использует алгоритм кэширования, который работает следующим образом:
МенеджерВременныхТаблиц или временные таблицы в рамках одного пакета, платформа сначала проверяет текущее соединение с СУБД. Она ищет, не была ли ранее в этом же соединении создана таблица с точно такой же структурой (количество колонок, их типы данных, длина и точность).CREATE TABLE мы увидим команду TRUNCATE TABLE или DELETE FROM. Это значительно быстрее, чем полное пересоздание структуры.Важно понимать, как на этот процесс влияет архитектура 1С. Рассмотрим ситуацию подробнее: сервер приложений поддерживает пул соединений с базой данных. Одно и то же физическое соединение SQL может последовательно обслуживать запросы разных пользователей. Если пользователь «А» завершил работу с запросом, в котором была временная таблица, и его соединение вернулось в пул, то при поступлении запроса от пользователя «Б» (если он попадет в то же соединение) платформа может обнаружить оставшуюся структуру таблицы.
Объект МенеджерВременныхТаблиц в программном коде 1С управляет временем жизни этих таблиц с точки зрения логики приложения, но на уровне SQL-сервера платформа оставляет за собой право «придержать» таблицу в tempdb для будущих нужд.
Проанализируем пример того, как это выглядит в коде 1С:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ Ссылка ПОМЕСТИТЬ ВТ_Данные ИЗ Справочник.Номенклатура";
Запрос.Выполнить();
Если этот код выполняется многократно в высоконагруженной системе, мы заметим, что CREATE TABLE #tt1 выполнится лишь один раз (при первом обращении в рамках конкретного соединения), а во все последующие разы платформа будет сразу переходить к заполнению таблицы.
Почему эта оптимизация так важна? Выясним причину, заглянув во внутреннее устройство SQL Server. В базе данных tempdb существуют специальные страницы управления распределением пространства — GAM (Global Allocation Map), SGAM (Shared Global Allocation Map) и PFS (Page Free Space). При частом создании и удалении временных таблиц сотнями сессий одновременно возникает конкуренция за доступ к этим страницам (так называемый TempDB Contention).
Благодаря тому, что 1С не выполняет CREATE TABLE каждый раз:
tempdb.TRUNCATE практически не логируется по сравнению с операциями изменения метаданных.Рассмотрим ситуацию, когда мы используем индексирование. Если в запросе 1С указано ИНДЕКСИРОВАТЬ ПО..., платформа также пытается оптимизировать работу с индексами. Если кэшированная таблица уже имеет необходимые индексы, они будут переиспользованы. Если же структура совпадает, но индексы другие, платформа может выполнить команду CREATE INDEX отдельно, не затрагивая саму таблицу. Это еще раз подтверждает гибкость алгоритма оптимизации.
Не стоит думать, что временные таблицы остаются в базе вечно. Разберем случаи, когда платформа всё-таки выполнит DROP TABLE:
rphost все временные таблицы, связанные с данными соединениями, уничтожаются SQL-сервером автоматически.Для тех, кто хочет убедиться в этом поведении самостоятельно, рекомендуем запустить SQL Server Profiler или использовать Расширенные события (Extended Events). Обратите внимание на события SP:StmtStarting или SQL:StmtStarting. Вы увидите, что перед операцией INSERT часто проскакивает быстрая команда очистки, но отсутствует создание. Это верный признак того, что платформа успешно применила оптимизацию повторного использования структуры.
Подводя итог, можно сказать, что отсутствие CREATE TABLE — это не повод для беспокойства, а свидетельство эффективной работы механизмов платформы 1С по снижению нагрузки на серверную инфраструктуру.