Имя: Пароль:
1C
1С v8
Оптимизация через временную таблицу запроса?
,
0 Антиквар
 
16.05.22
12:30
Всем привет!
Есть справочник, допустим контрагентов. Нужно выбрать из него только нужных.
Список нужных элементов передается в массиве СписокКонтрагентов.
Т.е. делаем элементарный запрос Выбрать ... ИЗ Справочник.Контрагенты ГДЕ Контрагент.ССылка в (&СписокКонтрагентов)
Но по некоторым справочникам нужна ооочень большая выборка, т.е. в массиве передается очень большое число элементов, а в некоторых справочниках чуть ли не весь справочник.
В этом случае условие: ГДЕ Контрагент.ССылка в (&СписокКонтрагентов)
будет работать не оптимально?
Может быть лучше передавать изначально не массив нужных элементов (этот массив выгружается из результата запроса), а временную таблицу?
1 ИУБиПовиц
 
16.05.22
12:38
>>не массив нужных элементов (этот массив выгружается из результата запроса)
Зачем выгружать из запроса, а потом обратно загружать:)
Поместите во временную таблицу в первом запросе, потом обратитесь во втором в ней же.
Еще возможно проиндексировать по контрагенту..
2 lodger
 
16.05.22
13:59
(0) откройте для себя МенеджерВременныхТаблиц.
3 Антиквар
 
16.05.22
14:05
(1)  > Зачем выгружать из запроса, а потом обратно загружать:)
Да просто функции, возвращающие массив, давно уже есть и использовались для других целей.
Решил прикрутить их, но увидел, что по некоторым запросам выдает очень большой набор данных, и делать условие ГДЕ наверное неразумно.

(2) Изначально конечно сделал бы через ВТ, но легаси-код... Как говорится, не трогай пока работает
4 lodger
 
16.05.22
14:07
(3) ты либо оптимизируй, либо не трогай пока работает.
5 timurhv
 
16.05.22
14:32
(3) >Изначально конечно сделал бы через ВТ, но легаси-код... Как говорится, не трогай пока работает
Если "СписокКонтрагентов" будет 128 элементов, то в запрос будет переданы параметры 1..128.
Если больше 128, то будет создана временная таблица и использовано внутреннее соединение.
6 Антиквар
 
16.05.22
14:36
(5) Да, больше 128 элементов.
Получается, что переделав на ВТ, ничего особо не выиграю, платформа сама это сделает.
Только код будет смотреться более "правильно"
7 timurhv
 
16.05.22
14:37
(6) Да, если при обновлении платформы разработчики 1С сами это количество не изменят.
8 Конструктор1С
 
16.05.22
14:41
(0) ты опоздал с этой оптимизацией. Уже давно платформа подменяет список на ВТ в конструкции В(), если в списке больше ста с чем-то элементов
9 Конструктор1С
 
16.05.22
14:42
(5) вот, да
10 youalex
 
16.05.22
15:13
(6) На 8.2 (точнее не скажу) операция "создана временная таблица" - выполнялась очень небыстро, т.к. для каждого элемента списка выполнялся отдельный insert values. Но возможно этот момент оптимизнули
11 Новиков
 
16.05.22
15:26
(0) >>В этом случае условие: ГДЕ Контрагент.ССылка в (&СписокКонтрагентов)

Если это условие фактически мертвое (иначе не понятно зачем вы туда передаете "почти весь" справочник), разумнее фильтрить по какому-то другому полю, которое не представляет такой вариативности. Возможно вам сбоку (если это возможно) в справочнике контрагента нужно ввести какой-то фильтр индексированный, по которому вы поймете - следует ли данного контрагента учитывать в ваших отборах или нет. Т.е. надо подумать как вам уйти от джойна всего со всем к простому фильтру/простому джойну.
12 H A D G E H O G s
 
16.05.22
15:35
(10) Оптимизировали
13 H A D G E H O G s
 
16.05.22
15:35
(10) bulk insert
14 Курцвейл
 
16.05.22
16:49
(13) insert values будет быстрее транзакциями по 5000 записей
15 Курцвейл
 
16.05.22
16:50
(10) Тормознуто могло быть только если на каждый инсерт была отдельная транзакция
16 H A D G E H O G s
 
16.05.22
17:01
(15) Каждый отдельный insert - это вызов сервера SQL с сервера 1С. Будет на порядки тормознее, даже если сервера вместе через sharedmem, чем одним запросом.
17 Fragster
 
гуру
16.05.22
17:02
(0) если ты проверишь в профайлере, то увидишь, что передача массива и так начиная с определенного количества элементов заменяется на временную таблицу
18 Kassern
 
16.05.22
17:06
(17) это делает сама 1с, или скуль?
19 Курцвейл
 
16.05.22
17:07
(16) А bulk insert это подготовка отдельного файла.
20 Курцвейл
 
16.05.22
17:09
(19) Единственный минус у 1С это тормоза укладывания больших текстовых инструкций.
Быстрее будет использовать сторонние языки
21 Ёпрст
 
16.05.22
17:10
(19) булка всё равно быстрее, даже с учетом затрат на создание файла
22 Fragster
 
гуру
16.05.22
17:32
(18) 1с
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший