HighLoad ›
Оптимизация кода 1С: простые приемы ›
#2
20.09.16 22:17
Решения о том что нужно оптимизировать, а что нет лучше принимать на основании замеров. Я набросал несколько искусственных примеров, которые демонстрирую суть проблемы.
Код с микро-запросами в цикле:
Код |
---|
Для каждого СтрокаТЧ из ЗаказПокупателя.СтруктураИзделияТЧ Цикл
Артикул = СтрокаТЧ.Номенклатура.Артикул;
КонецЦикла;
|
Замер - 6,2 сек после прогрева на документе с примерно 2000 строк.
Один запрос вытаскивает те же данные. Отбор массивом:
Код |
---|
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В(&МассивНоменклатуры)";
Запрос.Параметры.Вставить("МассивНоменклатуры", ЗаказПокупателя.СтруктураИзделияТЧ.ВыгрузитьКолонку("Номенклатура"));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Артикул = Выборка.Артикул;
КонецЦикла;
|
Замер 200 мс.
Фильтрация с использованием временной таблицы, те же данные:
Код |
---|
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫРАЗИТЬ(ЗаказПокупателяСтруктураИзделияТЧ.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура
|ПОМЕСТИТЬ втНоменклатуры
|ИЗ
| Документ.ЗаказПокупателя.СтруктураИзделияТЧ КАК ЗаказПокупателяСтруктураИзделияТЧ
|ГДЕ
| ЗаказПокупателяСтруктураИзделияТЧ.Ссылка = &Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В
| (ВЫБРАТЬ
| т.Номенклатура
| ИЗ
| втНоменклатуры КАК т)";
Запрос.Параметры.Вставить("Ссылка", ЗаказПокупателя);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Артикул = Выборка.Артикул;
КонецЦикла;
|
Замер 70 мс.
Так что, в данном случае, в первую очередь надо убирать микрозапросы, потом думать о способе фильтрации, если разница в 130 мс нас еще беспокоит.
Индексы тут не помогут, потому что поле Ссылка и так всегда проиндексировано. Повторное использование возвращаемых значений - далеко не всегда подойдет. Это надо чтобы значения на самом деле повторно вычислялись, и была на готове функция, которую можно туда записать.
Сравнивать по скорости умножение в запросе и во встроенном языке нет особого желания. Я бы стал этим заниматься, если бы на замере увидел, что умножение у меня - самая медленная операция. Но такого пока не было, поэтому я не стесняюсь умножать там где мне удобнее.