|
Оптимизация через временную таблицу запроса? | ☑ | ||
---|---|---|---|---|
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с
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |