Временные таблицы в запросах 1С

Временную таблицу в запросе можно создать с помощью ключевого слова ПОМЕСТИТЬ:

ВЫБРАТЬ
	Бренды.Ссылка КАК Ссылка,
	Бренды.Наименование КАК Наименование,
	Бренды.Код КАК Код
ПОМЕСТИТЬ ВТБренды
ИЗ
	Справочник.Бренды КАК Бренды
;
 
//////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТБренды.Ссылка КАК Ссылка,
	ВТБренды.Наименование КАК Наименование,
	ВТБренды.Код КАК Код
ИЗ
	ВТБренды КАК ВТБренды

В данном примере выборка из справочника Бренды будет помещена во временную таблицу ВТБренды, а уже потом данные будут выбраны из временной таблицы.

При создании новой временной таблицы она не сохраняется в базе данных. В файловой базе она хранятся в оперативной памяти, в MS SQL Server в специальной служебной базе TempDB.

Временные таблицы можно использовать, чтобы не выбирать данные из какой-то таблицы несколько раз. Один раз выбрали их, поместили во временную таблицу и дальше используем уже временную таблицу.

Также временные таблицы можно использовать для оптимизации работы СУБД. Если вместо временной таблицы использовать вложенный запрос, то оптимизатор не будет знать сколько строк в этой таблице и не сможет оптимизировать план запроса. В случае использования временной таблицы количество строк будет известно, что позволит лучше оптимизировать план запроса.

Но у временных таблиц есть и свои минусы. Во-первых на создание временной таблицы тратится время. Во-вторых, они могут занимать много места на диске.

Менеджер временных таблиц

Менеджер временных таблиц позволяет управлять временными таблицами. Один менеджер временных таблиц может управлять несколькими временными таблицами, но имена временных таблиц не должны совпадать.

Уничтожить временную таблицу можно несколькими способами:

  • Использовать метод Закрыть() менеджера временных таблиц
  • Использовать ключевое слово УНИЧТОЖИТЬ в запросе.
  • Все временные таблицы, которыми управляет менеджер временных таблиц будут автоматически удалены при удалении переменной, в которой хранился менеджер временных таблиц. Например, в процедуре был создан новый менеджер временных таблиц, при выходе из этой процедуры все временные таблицы будут автоматически удалены.

Пример уничтожения временной таблицы в запросе:

ВЫБРАТЬ
	Бренды.Ссылка КАК Ссылка,
	Бренды.Наименование КАК Наименование,
	Бренды.Код КАК Код
ПОМЕСТИТЬ ВТБренды
ИЗ
	Справочник.Бренды КАК Бренды
;
 
//////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВТБренды

Временные таблицы, которые были созданы в менеджере временных таблиц будут доступны в других запросах с этим же менеджером временных таблиц.

Запрос на создание временной таблицы вернет одну строку с колонкой Количество. В этой колонке будет количество строк во временной таблице.

//создаем менеджер временных таблиц
МенВремТаблиц = Новый МенеджерВременныхТаблиц;
 
Запрос1 = Новый Запрос;
//используем в запросе менеджер временных таблиц
Запрос1.МенеджерВременныхТаблиц = МенВремТаблиц;
Запрос1.Текст = "ВЫБРАТЬ
|	Бренды.Ссылка КАК Ссылка,
|	Бренды.Наименование КАК Наименование,
|	Бренды.Код КАК Код
|ПОМЕСТИТЬ ВТБренды
|ИЗ
|	Справочник.Бренды КАК Бренды";
Результат1 = Запрос1.Выпoлнить();
Выборка1 = Результат1.Выбрать();
Сообщить(Выборка1.Количество()); //1 строка 
 
Запрос2 = Новый Запрос;
//используем в запросе менеджер временных таблиц
Запрос2.МенеджерВременныхТаблиц = МенВремТаблиц;
Запрос2.Текст = "ВЫБРАТЬ
|	ВТБренды.Ссылка КАК Ссылка,
|	ВТБренды.Наименование КАК Наименование,
|	ВТБренды.Код КАК Код
|ИЗ
|	ВТБренды КАК ВТБренды";
Результат2 = Запрос2.Выпoлнить();
Выборка2 = Результат2.Выбрать();
Сообщить(Выборка2.Количество()); //количество элементов в справочнике

Индексы временных таблиц

Временные таблицы можно индексировать. Индексирование позволит ускорить операции соединения с временными таблицами, фильтрацию (условие ГДЕ) и т.п. Но на построение индексов тратится время. Поэтому не стоит индексировать все подряд временные таблицы. Например, таблицу в которой три строки точно не нужно индексировать. И не нужно индексировать все поля. Индексировать нужно те поля, которые будут использоваться в условиях отбора (ГДЕ) и в условиях соединения таблиц.

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |	Бренды.Ссылка КАК Ссылка,
               |	Бренды.Наименование КАК Наименование,
               |	Бренды.Код КАК Код
               |ПОМЕСТИТЬ ВТБренды
               |ИЗ
               |	Справочник.Бренды КАК Бренды
               |
               |ИНДЕКСИРОВАТЬ ПО
               |	Ссылка";

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: