8.х Оптимизация запроса

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем AsadRoman, 1 авг 2017.

  1. TopicStarter Overlay
    AsadRoman
    Offline

    AsadRoman

    Регистрация:
    22 авг 2011
    Сообщения:
    38
    Симпатии:
    0
    Баллы:
    1
    Одна из фирм-франчази прислала в качестве тестового задания. Мне не для получения результата (он уже отрицательный), а для себя: как это все-таки нужно сделать?
    Собственно задание: Есть запрос, нужно его оптимизировать.

    Код:
    "ВЫБРАТЬ
    | ЗакупкиОбороты.Контрагент
    |ПОМЕСТИТЬ ВТ_Контрагенты
    |ИЗ
    | РегистрНакопления.Закупки.Обороты(
    | &ДатаНачала,
    | &ДатаОкончания,
    | ,
    | Организация = &Организация
    | И Валюта = &Валюта) КАК ЗакупкиОбороты
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ВЫБОР
    | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа)
    | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1
    | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1
    | КОНЕЦ КАК Контрагент,
    | ВЫБОР
    | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа)
    | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1.Описание
    | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1.Описание
    | КОНЕЦ КАК ОписаниеКонтрагента,
    | УправленческийДвиженияССубконто.Сумма,
    | УправленческийДвиженияССубконто.Регистратор,
    | УправленческийДвиженияССубконто.Содержание
    |ИЗ
    | РегистрБухгалтерии.Управленческий.ДвиженияССубконто(
    | &ДатаНачала,
    | &ДатаОкончания,
    | Организация = &Организация
    | И ((СчетДт В ИЕРАРХИИ (&СчетГруппа)
    | И СубконтоДт1 В
    | (ВЫБРАТЬ
    | ВТ_Контрагенты.Контрагент
    | ИЗ
    | ВТ_Контрагенты))
    | ИЛИ (СчетКт В ИЕРАРХИИ (&СчетГруппа)
    | И СубконтоКт1 В
    | (ВЫБРАТЬ
    | ВТ_Контрагенты.Контрагент
    | ИЗ
    | ВТ_Контрагенты))),
    | ,
    | ) КАК УправленческийДвиженияССубконто";
    Последнее редактирование модератором: 2 авг 2017
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.475
    Симпатии:
    861
    Баллы:
    204
    фига се :)
    Оптимизация - это как бы тока за бабло и не маленькое....

    УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа) будет работать тока на последних версиях платформы....

    Сам-то что предложил?
  3. TopicStarter Overlay
    AsadRoman
    Offline

    AsadRoman

    Регистрация:
    22 авг 2011
    Сообщения:
    38
    Симпатии:
    0
    Баллы:
    1
    Сделал вот так:

    // По первому запросу: добавил "различные" чтобы избежать дублирования контрагентов
    // По второму запросу применил внутреннее соединение. Считаю применение его более оптимальным.
    ТекстЗапроса =
    Код:
    "ВЫБРАТЬ различные
    | ЗакупкиОбороты.Контрагент
    |ПОМЕСТИТЬ ВТ_Контрагенты
    |ИЗ
    | РегистрНакопления.Закупки.Обороты(
    | &ДатаНачала,
    | &ДатаОкончания,
    | ,
    | Организация = &Организация
    | И Валюта = &Валюта) КАК ЗакупкиОбороты
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ВЫБОР
    | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа)
    | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1
    | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1
    | КОНЕЦ КАК Контрагент,
    | ВЫБОР
    | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа)
    | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1.Описание
    | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1.Описание
    | КОНЕЦ КАК ОписаниеКонтрагента,
    | УправленческийДвиженияССубконто.Сумма,
    | УправленческийДвиженияССубконто.Регистратор,
    | УправленческийДвиженияССубконто.Содержание
    |ИЗ
    | РегистрБухгалтерии.Управленческий.ДвиженияССубконто(
    | &ДатаНачала,
    | &ДатаОкончания,
    | Организация = &Организация
    | И (СчетДт В ИЕРАРХИИ (&СчетГруппа)
    | ИЛИ СчетКт В ИЕРАРХИИ (&СчетГруппа)),
    | ,
    | ) КАК УправленческийДвиженияССубконто
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты
    | ПО (ВЫБОР
    | КОГДА УправленческийДвиженияССубконто.СчетДт В ИЕРАРХИИ (&СчетГруппа)
    | ТОГДА УправленческийДвиженияССубконто.СубконтоДт1
    | ИНАЧЕ УправленческийДвиженияССубконто.СубконтоКт1
    | КОНЕЦ = ВТ_Контрагенты.Контрагент)";
    получил ответ:
    1. - "По первому запросу: добавил "различные" чтобы избежать дублирования контрагентов" - Не согласен. виртуальные таблицы возвращают результат в максимально сгруппированном виде
    - "По второму запросу применил внутреннее соединение. Считаю применение его более оптимальным." - Не согласен. Соединение с виртуальными таблицами может очень сильно замедлить время выполнения запроса на некоторых данных.
    - Обращение через точку к полю составного типа не исправлено.
    Если по последнему пункту понятно, то по остальному:
    Что нужно-то?
    Я так с первыми двумя возражениями не согласен. Особенно напрягает слово "может". А может не может?
    Последнее редактирование модератором: 2 авг 2017
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    8.475
    Симпатии:
    861
    Баллы:
    204
    По п.1 замечание верное. Различные в данном случае не нужны вообще.
    по п.2. зависит от количества строк в таблице скорее, но делать временную таблицу на более чем 1000 строк - смысла мало, ИМХО.
    поэтому тут нужно сравнивать скорость выполнения запроса на конкретной БД.

    Ну и я бы еще поменял таблицу на ОборотыДтКт и избавился бы от ИЛИ через ОБЪЕДИНИТЬ
  5. TopicStarter Overlay
    AsadRoman
    Offline

    AsadRoman

    Регистрация:
    22 авг 2011
    Сообщения:
    38
    Симпатии:
    0
    Баллы:
    1
    Тогда остается только отказываться от временной таблицы и избавляться от ИЛИ
  6. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    855
    Симпатии:
    149
    Баллы:
    104
    1. В Иерархии (&ГруппаСчетов) заменить на В (&СписокСчетов)
    2. ИЛИ заменить на Объединить Все
    3. Выразить(Субконто КАК Тип)

    Всё :)
    PS: Хочу печеньку)
    AsadRoman нравится это.
  7. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.363
    Симпатии:
    148
    Баллы:
    104
    Будет работать и на 8.2
    --- Объединение сообщений, 9 авг 2017 ---
    Положь печеньку :)
    СписокСчетов откуда брать будем?
    --- Объединение сообщений, 9 авг 2017 ---
    Человек процитировал методику разработки конфигураций от 1С.

    По первому возражению. Подзапрос, который делается к СУБД для получения данных виртуальной таблицы оборотов регистра накопления все равно делает группировку по выбираемым измерениям. Поэтому дополнительно ставить РАЗЛИЧНЫЕ нет никакого смысла, прост повторит те же действия еще раз.

    По второму. Внутреннее соединение будет давать очень разные результаты в зависимости от количества строк во временной таблице и количества строк, которые возвращает виртуальная таблица.
    В запросе к СУБД будет внутреннее соединение с подзапросом, не все сервера и не всех версий могут нормально такое скушать и затащить соединение в плане запроса внутрь подзапроса (а он там весьма веселый и зависит от данных)
    Естественно может и не замедлить. Но стабильность этого "может" никакая.

    И это, возражал не я :)
    Последнее редактирование: 9 авг 2017
  8. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    855
    Симпатии:
    149
    Баллы:
    104
    Обычно вручную коллекция создаётся и передаётся как параметр ВТ, это обычный приём в типовых, ибо счетов мало и почти все они предопределенные. Матчасть, кэп :)
  9. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.363
    Симпатии:
    148
    Баллы:
    104
    только если список счетов заранее определен.
    а если там пользователь субсчетов нарожал? тогда та же выборка В ИЕРАРХИИ и без вариантов
  10. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.320
    Симпатии:
    85
    Баллы:
    54
    Доброго,
    Есть еще нюанс о котором все знают, поскольку в условии используется "или", то, в общем случае "СубконтоДт1", "СубконтоКт1" могут содержать тип не совпадающий с типом "справочник.контрагент"
    и для того чтобы взять например "СубконтоДт1.Описание" нужно прогнать его через "ВЫРАЗИТЬ" т.е. - ВЫРАЗИТЬ(УправленческийДвиженияССубконто.СубконтоДт1 КАК Справочник.Контрагенты).Описание
    --- Объединение сообщений, 11 авг 2017 ---
    ну и конечно нужно сделать "ВЫРАЗИТЬ" и в условии по виртуальным таблицам регистра :
    Код:
    РегистрБухгалтерии.Управленческий.ДвиженияССубконто(
                   &ДатаНачала,
                 , &ДатаОкончания
                 , Организация = &Организация
                    И ((СчетДт В ИЕРАРХИИ (&СчетГруппа)
                    И ВЫРАЗИТЬ(СубконтоДт1 КАК Справочник.Контрагенты) В (ВЫБРАТЬ
                                                                        ВТ_Контрагенты.Контрагент
                                                                    ИЗ
                                                                        ВТ_Контрагенты))
    ) КАК УправленческийДвиженияССубконто
    
    это сократит число соединяемых таблиц в отборе
    Последнее редактирование: 11 авг 2017
  11. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.363
    Симпатии:
    148
    Баллы:
    104
    Код:
    И ВЫРАЗИТЬ(СубконтоДт1 КАК Справочник.Контрагенты) В (ВЫБРАТЬ
    ВТ_Контрагенты.Контрагент
    ИЗ
    ВТ_Контрагенты))
    
    тут не будет никаких соединений если убрать ВЫРАЗИТЬ
    Единственное что это даст - лишняя проверка типа субконто в соединениях подзапроса

Поделиться этой страницей