К таблице значений добавить вторую таблицу значений. Нужен оптимальный метод.
Сейчас код выглядит так:
Цикл проходит по нему 500 тысяч раз и это занимает очень много времени. Как быстрее можно объединить две таблицы? Пока идея такая - запросом, добавляя описание временных таблиц? Но может быть есть метод интереснее? Не хочу изобретать велосипед.
РезультатЗапроса = Запрос.Выполнить();
ТЗ_Добавляемая = РезультатЗапроса.Выгрузить();
Для каждого Строка Из ТЗ_Добавляемая Цикл
НоваяСтрока = ТЗ_Исходная.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
конеццикла;
Цикл проходит по нему 500 тысяч раз и это занимает очень много времени. Как быстрее можно объединить две таблицы? Пока идея такая - запросом, добавляя описание временных таблиц? Но может быть есть метод интереснее? Не хочу изобретать велосипед.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
1. Он передает все данные на сервер СУБД, там объединяет и выгружает назад в виде таблицы. Т.е. это нагрузка на сервер и сеть, если там не шаредмемори и СУБД на одном сервере с 1С. Для файловой базы имеет какой-то смысл, но 500к строк и файловая база - это какая-то жесть.
2. Сервер СУБД может быть загружен активно работающими юзерами.
В части реализации, то перенос в одну строку всего цикла часто ускоряет процесс. Т.е. следует писать так:
запросом
Запрос будет работать не всегда быстрее, ибо:
1. Он передает все данные на сервер СУБД, там объединяет и выгружает назад в виде таблицы. Т.е. это нагрузка на сервер и сеть, если там не шаредмемори и СУБД на одном сервере с 1С. Для файловой базы имеет какой-то смысл, но 500к строк и файловая база - это какая-то жесть.
2. Сервер СУБД может быть загружен активно работающими юзерами.
В части реализации, то перенос в одну строку всего цикла часто ускоряет процесс. Т.е. следует писать так:
Для каждого Ст ИЗ ТаблицаПоменьше Цикл ЗаполнитьЗначенияСвойств(ТаблицаПобольше.Добавить(), Ст) КонецЦикла;
(10)
Где это описано?
Официально - нигде. И работает не всегда. Но для циклов получается ощутимый прирост, т.к. не компилируются и не исполняются переходы строк, которые, с точки зрения ВМ 1С, исполняющей код, требуют для исполнения некоторое время. На циклах 100к эффект точено ощущается.
В общем быстро "сварил на коленке" код, объединяющий две таблицы с одинаковыми колонками, протестировал на больших таблицах, результат почти в 2 раза быстрее. Позже буду на рабочей базе проверять, возможно отпишусь.
Вот код:
Вот код:
&НаСервере
Процедура ВыполнитьОбъединениеТаблицНаСервере()
Таблица1 = ПолучитьТаблицу1();
Таблица2 = ПолучитьТаблицу2();
РезультирующаяТаблица = ОбъединитьТаблицыСИдентичнымиКолонками(Таблица1, Таблица2);
КонецПроцедуры
&НаСервере
Функция ОбъединитьТаблицыСИдентичнымиКолонками(Таблица1, Таблица2)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ *
|Поместить ВТ_Таблица1
|ИЗ
| &Таблица1 КАК Таблица1;
|Выбрать *
|Поместить ВТ_Таблица2
|ИЗ
| &Таблица2 КАК Таблица2;
|Выбрать *
|ИЗ ВТ_Таблица1
|
|ОБЪЕДИНИТЬ ВСЕ
|
|Выбрать *
|ИЗ ВТ_Таблица2";
Запрос.УстановитьПараметр("Таблица1", Таблица1);
Запрос.УстановитьПараметр("Таблица2", Таблица2);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Возврат РезультатЗапроса;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот