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