e9a2cc89

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

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

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

2. Есть ситуации, когда временные таблицы не следует создавать или создание временных таблиц необходимо минимизировать.

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

2.2. Следует максимально ограничивать количество данных, выбираемых во временную таблицу. Не следует помещать во временную таблицу больше данных, чем требуется последующим запросам.

2.3. Не следует помещать во временную таблицу поля, которые не используются в последующих запросах, т.к. время и место для их размещения тратится впустую.

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

2.5. Не следует копировать одну временную таблицу в другую только ради того, чтобы переименовать первую таблицу во вторую. Вместо этого, следует передавать имя таблицы.

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

3.1. Индекс следует строить если:

3.1.1. Большая временная таблица участвует в соединении (не важно, с какой стороны). В индекс следует добавлять поля, участвующие в условии ПО .

3.1.2. Обращение к временной таблице выполняется в подзапросе конструкции логического оператора В (. ) . В индекс следует добавлять поля временной таблицы из списка выбора, соответствующие перечисленным с левой стороны логического оператора В (. ) .

Читайте также:  Схема пушки гаусса в домашних условиях

3.2. Маленькие временные таблицы индексировать не нужно (менее 1000 записей).

3.3. Если условий выбора или соединений с временной таблицей больше одного, и только одно из них проверяется часто, то индекс следует строить для наиболее часто проверяемого условия.

Собственные наработки и набитые шишки в моей практике по программированию в 1С.

Страницы

четверг, 2 октября 2014 г.

Использование менеджера временных таблиц в запросах

Использование менеджера временных таблиц весьма эфективно при больших объемах данных.

Приведу пример как рационально применять даный метод запроса. Есть определенные задачи которые нельзя решить одним запросом и приходится делать не очень красивые решения. запросы в цикле например. И даже если к такому приходится "опустится" то надо уже подумать о максимуме оптимизации. Возможно менеджер временных таблиц и будет ящиком пандоры для спасения.

Важным есть удаление временных таблиц и закрытие менеджера временных таблиц.

МенВрТаб = Новый МенеджерВременныхТаблиц ;

Счет6202 = ПланыСчетов . Хозрасчетный . НайтиПоКоду ( "62.02" );
Счет76АВ = ПланыСчетов . Хозрасчетный . НайтиПоКоду ( "76.АВ" );

Запрос = Новый Запрос ();
Запрос . УстановитьПараметр ( "ДатаАнализа" , Новый Граница ( КонецДня ( ДатаАнализа ), ВидГраницы . Включая ));
Запрос . УстановитьПараметр ( "Организация" , Организация );
Запрос . УстановитьПараметр ( "Счет6202" , Счет6202 );
Запрос . УстановитьПараметр ( "Счет76АВ" , Счет76АВ );

Запрос . МенеджерВременныхТаблиц = МенВрТаб ;

Запрос . Текст = ТекстЗапроса ;
Запрос . Выполнить (); // ОсновнойМенВрТаб = Запрос . МенеджерВременныхТаблиц ; //сохраняем ссылку на основную таблицу менеджера
ТабличноеПоле . Очистить ();

//-> обходим периоды в цикле пытаясь найти все проблемные периоды

ЕщеЕстьРасхождения = Истина;
РасчетнаяДата = ДатаАнализа ;

Пока ЕщеЕстьРасхождения Цикл

РасчетнаяДата = НачалоМесяца ( РасчетнаяДата )- 1 ;

ЗапросПериоды . УстановитьПараметр ( "Период" , КонецДня ( РасчетнаяДата )+ 1 );
ЗапросПериоды . УстановитьПараметр ( "ДатаАнализа" , Новый Граница ( КонецДня ( РасчетнаяДата ), ВидГраницы . Включая ));
ЗапросПериоды . УстановитьПараметр ( "Организация" , Организация );
ЗапросПериоды . УстановитьПараметр ( "Счет6202" , Счет6202 );
ЗапросПериоды . УстановитьПараметр ( "Счет76АВ" , Счет76АВ );

Читайте также:  Как запустить тестовую трансляцию на twitch

ЗапросПериоды . МенеджерВременныхТаблиц = ОсновнойМенВрТаб ;

Рез = ЗапросПериоды . ВыполнитьПакет ();

ЕщеЕстьРасхождения = Булево ( Рез . Получить ( 2 ). Выгрузить (). Получить ( 0 ). Количество > 0 ); //[ВремТаблРасхождения] таблица уменшается при переходящем периоде.
Таблица = Рез . Получить ( 3 ). Выгрузить (); //таблица найденных ПРОБЛЕМНЫХ периодов (к этому периоду прибавлен месяц и это будет проблемный месяц)

Для Каждого Выборка Из Таблица Цикл

НоваяСтрока = ТабличноеПоле . Добавить ();
ЗаполнитьЗначенияСвойств ( НоваяСтрока , Выборка );

ОсновнойМенВрТаб = ЗапросПериоды . МенеджерВременныхТаблиц ;

КонецЦикла; // уничтожаем временну таблицу и закрываем менеджер!
УдалениеМенеджераВТ = Новый Запрос ();
УдалениеМенеджераВТ . МенеджерВременныхТаблиц = ОсновнойМенВрТаб ;

УдалениеМенеджераВТ . Текст = "УНИЧТОЖИТЬ ВремТаблРасхождения" ;
УдалениеМенеджераВТ . Выполнить ();

Вывод результата менеджера временных таблиц в таблицу значений (отладка данных МВТ)

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

Функция ВывестиРезультатМенеджераВременныхТаблиц ( МенеджерВременныхТаблиц , ИмяТаблицы ) Экспорт

//Получаем таблицу из менеджера временных таблиц запроса
Запрос = Новый Запрос ( "ВЫБРАТЬ * ИЗ " + ИмяТаблицы );
Запрос . МенеджерВременныхТаблиц = МенеджерВременныхТаблиц ;

Возврат Запрос . Выполнить (). Выгрузить ();
КонецФункции

Вывод дополнительных полей МВТ.

Подобная функция, только в третий параметр передаются дополнительные поля. При необходимости увидеть для целей отладки какой-то реквизит после точки.
В параметр ДополнительныеПоля передаем например "Номенклатура.Поставщик, Номенклатура.Менеджер" и т.д.

Функция ВывестиРезультатМенеджераВременныхТаблиц ( МенеджерВременныхТаблиц , ИмяТаблицы , ДополнительныеПоля = "" ) Экспорт

//Получаем таблицу из менеджера временных таблиц запроса
Запрос = Новый Запрос ( "ВЫБРАТЬ *" +?(Не ПустаяСтрока ( ДополнительныеПоля ), ", " + ДополнительныеПоля , "" )+ " ИЗ " + ИмяТаблицы );
Запрос . МенеджерВременныхТаблиц = МенеджерВременныхТаблиц ;

Возврат Запрос . Выполнить (). Выгрузить ();
КонецФункции

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

Временные таблицы в 1С

Временные таблицы — это объекты СУБД, никаких временных таблиц на сервере 1С нет, не путайте пожалуйста, их с таблицами значений.

Читайте также:  Неисправность контроллера жесткого диска

Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.

Физически временные таблицы по умолчанию создаются в оперативной памяти, а именно в буферном кэше.

Конечно, есть исключения. Например, если таблица слишком большая, то сервер может принять решение сбросить ее на диск. Также возможна ситуация, когда сервер по каким-либо причинам решил отдать память под другие данные, тогда таблица тоже будет записана на диск.

Почему таблица создается именно в памяти? Тут все очевидно, дело в производительности, думаю не стоит объяснять, что чтение из оперативной памяти гораздо быстрее чтения с диска, даже если этот диск SSD.
Чтобы создать временную таблицу, используется ключевое слово «ПОМЕСТИТЬ В», например:

Ссылка на основную публикацию