Временные таблицы. Что на стороне СУБД?

26 января 2013

Файлы для загрузки:

Конфигурация с примерами из статьи

Предисловие

Начиная с версии платформы 1С:Предприятие 8.1 появилась поддержка работы в запросах с временными таблицами. Построение сложных запросов несколько упростилось, а работа с базой данных стала оптимальнее. Подробнее о работе с временными таблицами Вы можете прочитать во встроенной справке, мы же сегодня в статье рассмотрим действия платформы на стороне СУБД при работе с временными таблицами. В примерах будет использоваться MS SQL 2008 и 1С:Предприятие 8.2.16.368.

Создание

Создание временной таблицы происходит по результату какого-либо запроса. Для этого в тексте запроса используется конструкция "Поместить <ИмяВременнойТаблицы>". На следующем скриншоте показан запрос к справочнику "Товары", результат которого помещен во временную таблицу "Товары".

Создание временной таблицы "Товары"

При выполнении данного запроса платформа выполняет создание временной SQL-таблицы на сервере СУБД следующей командой:

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

Выделенная часть запроса как раз и выполняет помещение во временную таблицу результата выборки. После выражения "INSERT INTO" задается название временной таблицы "#tt2" и название полей, по которым в дальнейшем можно обращаться к данным в этой таблице. Сам запрос на выборку помещаемых во временную таблицу данных начинается с конструкции "SELECT". Подробнее об инструкции "SELECT ... INTO" Вы можете узнать по ссылке.

Работа с временной таблицей

Выше был приведен пример создание временной таблицы платформой, а также ее действия на стороне СУБД. Однако данный пример не имеет никакого практического применения, поскольку в дальнейшем обратиться к созданной временной таблице на стороне 1С:Предприятия мы никак не сможем. Особенностью работы платформы с такими таблицами является то, что их использование возможно либо в том же запросе, где они были созданы, либо если они хранятся в объекте с типом "МенеджерВременныхТаблиц" (подробную информацию по объекту см. во встроенной справке).

Создадим следующий пример: с помощью объекта "МенеджерВременныхТаблиц" сохраним две временные таблицы, каждая из которых содержит результат выборки в 15 записей из справочников "Товары" и "Комплектующие" Затем выберем все записи из созданных временных таблиц и объединим их в единый результат.

На стороне платформы программный код в этом случае будет выглядеть следующим образом:

Создание и использование временных таблиц в платформе 1С:Предприятие

О создании временных таблиц и действиях на SQL-сервере было написано выше. Сейчас нас интересует выборка из созданных ранее временных таблиц. При выполнении запроса к ним платформа формирует следующий SQL-команду:

Зарос к созданным ранее временным таблицам

Как мы видим, запрос не имеет чего-то особенного. Выборка осуществляется из временных таблиц, которые были созданным первыми двумя запросами. Платформа сохраняет соответствие между именем временной таблицы на SQL-сервере и именем, используемым разработчиком в платформе. Таким же образом платформа сопоставляет поля временной таблицы в SQL-базе с названиями полей в тексте запроса на стороне платформы.

Если бы все действия по созданию временным таблиц и выборку из них мы делали в рамках одного запроса, то использование объекта "МенеджерВременныхТаблиц" было бы не обязательным. Текст запроса в таком случае выглядел бы следующим образом:

Единый запрос без использования объекта "МенеджерВременныхТаблиц"

Уничтожение временной таблицыПринципиальных отличий в работе платформы с SQL-сервером в этом случае не будет. Единственной отличие - это уничтожение временных таблиц сразу после выполнения запроса. Выполняется это действие командой "TRUNCATE".

Использовать или нет объект "МенеджерВременныхТаблиц" зависит от необходимости использования временной таблицы в нескольких созданных объектах "Запрос", или при необходимости передать временную таблицу параметром в процедуру/функцию.

Интересной особеннсотью данного объекта является то, что с ним мы можем делать выборку в запросе из переданной в него как параметр таблицы значений (!!!). На следующем скриншоте показан программный код создания таблицы значений и передачи ее в запрос.

Запрос к таблице значений

При этом платформой выполняются SQL-команды для создания временной таблицы на SQL-сервере и заполнения ее значениями из "таблицы значений". Общая последовательность SQL-команд следующая:

  • Создание пустой временной таблицы.
  • Начало транзакции:
  • Для каждой строки в таблице значений выполняется команда по вставке значения во временную таблицу:
  • Завершение транзакции:

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

Время жизни

Как было отмечено выше, при выполнении запроса платформа уничтожает все временные таблицы, которые были созданы в рамках его выполнения. То есть, время жизни временных таблиц, создаваемых в рамках одного запроса со стороны платформы 1С:Предприятие, начинается от момента создания таблицы в запросе и завершается по его выполнении.

При этом возможно уничтожить временную таблицу программным образом, выполнив в одном из пакетов запроса инструкцию "УНИЧТОЖИТЬ <ИмяВременнойТаблицы>". Тогда платформа выполняет SQL-команду "TRUNCATE" на уничтожение временной таблицы.

При использовании менеджера временных таблиц, если таблицы не были явно уничтожены разработчиком (инструкция запроса "УНИЧТОЖИТЬ", сброс менеджера временных таблиц в "Неопределено" или методом "Закрыть()"), то платформа уничтожает их самостоятельно после того, как был уничтожен контекст, в рамках которого они были сформированы. Другими словами, объект будет уничтожен при завершении процедуры или функции, в которой он был создан.

Влияние на производительность

Использование временных таблиц позволяет существенно снизить нагрузку на SQL-сервер за счет многократного использования ранее сформированной выборки из таблицы в других запросах. Конечно, создание и хранение временных таблиц занимает дополнительные ресурсы, но, по сравнению с тратой ресурсов при повторных запросах к таблицам, этот вариант более оптимальный.

Создание же временных таблиц на основе таблицы значений может нести негативное влияние на производительность, поскольку передача таблицы значений и заполнение на ее основе временной таблицы на SQL-сервере может занять длительное время и создать дополнительную нагрузку на систему. Использовать эту возможность нужно только в том случае, если в дальнейшем запросы интенсивно используют данные из таблицы значений. В противном случае более оптимальным был бы шаг по обработке этой таблицы программным образом после выполнения запроса к базе данных. Точный ответ зависит от конкретной задачи.

Вывод

Поддержка временных таблиц платформой 1С:Предприятие позволяет писать более оптимальные запросы к базе данных, при этом сам текст запроса также упрощается и становится более читабельным.

Самым главным аргументом в пользу использования временных таблиц является то, что их использование позволяет SQL-серверу строить более оптимальные планы запросов. 

Как мы видим, не зря методика разработки на платформе 1С:Предприятие рекомендует использовать временные таблицы в запросах. Так что упрощаем запросы и читаем методичку.


comments powered by Disqus