Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Подскажите как оптимизировать или переписать запрос

Подскажите как оптимизировать или переписать запрос
Я
   vova1122
 
03.09.21 - 15:30
Подскажите как можно переписать или оптимизировать этот запрос чтобы ускорить время его выполнения

    Запрос = Новый Запрос;
            Запрос.Текст =
        "ВЫБРАТЬ
        |    ОборотноСальдоваяОстаткиИОбороты.СумаРасход КАК СумаРасход,
        |    ОборотноСальдоваяОстаткиИОбороты.СумаПриход КАК СумаПриход,
        |    ОборотноСальдоваяОстаткиИОбороты.Документ,
        |    ОборотноСальдоваяОстаткиИОбороты.Документ.Дата,
        |    ОборотноСальдоваяОстаткиИОбороты.Документ.Коментарий,
            |    ВЫБОР
        |        КОГДА ОборотноСальдоваяОстаткиИОбороты.Документ ССЫЛКА Документ.Начисление
        |            ТОГДА ""Начисление""
        |        КОГДА ОборотноСальдоваяОстаткиИОбороты.Документ ССЫЛКА Документ.НачальныеОстатки
        |            ТОГДА ""Остатки""
        |        КОГДА ОборотноСальдоваяОстаткиИОбороты.Документ ССЫЛКА Документ.Коректировка
        |            ТОГДА ""Коректировка""
        |        КОГДА ОборотноСальдоваяОстаткиИОбороты.Документ ССЫЛКА Документ.ОплатаБанк
        |            ТОГДА ""ОплатаБанк""
        |        ИНАЧЕ ЛОЖЬ
        |    КОНЕЦ КАК ВидДокумента
        |ИЗ
        |    РегистрНакопления.ОборотноСальдовая.ОстаткиИОбороты(&Дата1, &Дата2, , , &Контрагент = Контрагент) КАК ОборотноСальдоваяОстаткиИОбороты";
   1Сергей
 
1 - 03.09.21 - 15:31
Смотреть план запроса, думать
   Мультук
 
2 - 03.09.21 - 15:32
(0)

     |    ОборотноСальдоваяОстаткиИОбороты.Документ.Дата,
     |    ОборотноСальдоваяОстаткиИОбороты.Документ.Коментарий,

Выкинь эти два поля (для теста). Намного быстрее стало ?
   vova1122
 
3 - 03.09.21 - 15:34
(2) эти поля мне нужны
   polosov
 
4 - 03.09.21 - 15:34
ВЫБОР КОГДА Документ.Начисление ТОГДА ВЫРАЗИТЬ(ОборотноСальдоваяОстаткиИОбороты.Документ КАК Документ.Начисление).Дата
КОГДА ....
...
КОНЕЦ

С Комментарием также
   polosov
 
5 - 03.09.21 - 15:35
*(4)  Ну про это
ВЫБОР КОГДА Документ.Начисление 
думаю понятно как сделать.
   lodger
 
6 - 03.09.21 - 15:36
(3) ну ты попробуй без них.
   lodger
 
7 - 03.09.21 - 15:37
если будет заметная разница - будешь копать под неявные связи через точку, иначе может где-то ещё проблемы.
   elCust
 
8 - 03.09.21 - 15:37
(1) И сразу станет понятно, что "аттачатся" целая куча таблиц из за:

ОборотноСальдоваяОстаткиИОбороты.Документ,
        |    ОборотноСальдоваяОстаткиИОбороты.Документ.Дата,
        |    ОборотноСальдоваяОстаткиИОбороты.Документ.Коментарий,
   Малыш Джон
 
9 - 03.09.21 - 15:39
Документ.Дата скорее всего равен Периоду

Комментарий - через Выразить(Документ Как Документ.блаблабла).Комментарий
   vova1122
 
10 - 03.09.21 - 15:44
(2) без этих строк почти не ускорился (5-6)% - в пределах погрешности
   1Сергей
 
11 - 03.09.21 - 15:45
(10) Как вариант, попробуй условие вынести в ГДЕ
   RomanYS
 
12 - 03.09.21 - 15:47
(10) а тормозит точно запрос, а не постобработка?
   Dmitrii
 
13 - 03.09.21 - 15:47
(0) Для начала - подумать - зачем тебе нужна таблица ОстаткиИОбороты, если ты берешь только поля Приход и Расход? Почему не таблица Обороты? Это первая ошибка на экзамене Специалист, за которую ставят "Незачет".
Если дата начала и дата окончания периода выборки не кратны месяцу, то имеет смысл попробовать работать не с виртуальными таблицами, а с физической таблицей движений регистра.

Ну и разумеется про неявные левые соединения ко всем таблицам из-за конструкции ОборотноСальдоваяОстаткиИОбороты.Документ.Дата, ОборотноСальдоваяОстаткиИОбороты.Документ.Коментарий тебе уже написали.
   Dmitrii
 
14 - 03.09.21 - 15:48
(11) >>  попробуй условие вынести в ГДЕ.

У него вроде нет условий.
   youalex
 
15 - 03.09.21 - 15:48
(10) где проверяешь? если в консоли запросов - там время может тратиться на получение представления поля Документ. уже после запроса
попробуй сделать Поместить вт
   DTX 4th
 
16 - 03.09.21 - 15:48
(10) Эм, а сколько он у тебя выполняется?
Что-то мне сложно представить такую ситуацию
   Dmitrii
 
17 - 03.09.21 - 15:50
ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ВидДокумента.

Что это за лживый вид документа?
Некрасиво как-то.
   1Сергей
 
18 - 03.09.21 - 15:50
(14) >> У него вроде нет условий.

А это что?
&Контрагент = Контрагент
   1Сергей
 
19 - 03.09.21 - 15:51
   Dmitrii
 
20 - 03.09.21 - 15:51
(18) Если уж копать в сторону отказа от параметров виртуальных таблиц, то проще сразу отказываться от виртуальных таблиц и использовать первичные.
   Dmitrii
 
21 - 03.09.21 - 15:52
(19) Что там. Если кратко. Нет возможности посмотреть.
   vova1122
 
22 - 03.09.21 - 15:53
(16) (15) Прямо в программе (Толстый клиент, обычные формы )
Замер производительности на строке

ВсеДвижения = Запрос.Выполнить().Выгрузить();
 показывает 70% от всего кода процедуры
   Dmitrii
 
23 - 03.09.21 - 15:54
Предположу что история с какими-нибудь нетривиальными запросами, где сборка виртуальной таблицы с параметрами съедает больше времени и ресурсов, чем последующая обработка результатов этой сборки.
   elCust
 
24 - 03.09.21 - 15:54
(22) Я думаю нужно везде ограничить типы в ОборотноСальдоваяОстаткиИОбороты.Документ. Тогда должно стать быстрее.
   vova1122
 
25 - 03.09.21 - 15:54
(13)Пробовал и из таблицы ОстаткиИОбороты - время выполнения примерно тоже
   1Сергей
 
26 - 03.09.21 - 15:55
(20) не отказываться надо, а дублировать
(21) ну, там чел подробно разбирает что происходит когда 1с преобразует виртуальную таблицу в запрос SQL
   Dmitrii
 
27 - 03.09.21 - 15:57
(22) Фу. Какая мерзость. Тебе движения нужны, а ты юзаешь виртуальные таблицы. Да ещё и не те.
Движения надо получать из таблицы движений. Такой вот парадокс.
   vova1122
 
28 - 03.09.21 - 15:58
(27) брать из таблицы ОборотноСальдовая?
   Dmitrii
 
29 - 03.09.21 - 15:59
(28) Да.
   unbred
 
30 - 03.09.21 - 16:00
(25) хотел сказать "обороты" ? (24)  да, только там типов столько, что вспотеешь писать))
 
 
   Dmitrii
 
31 - 03.09.21 - 16:04
(30) >> там типов столько, что вспотеешь писать.

Чтобы не потеть, можно написать цикл, формирующий текст запроса - объединения по каждому виду документов - типу измерения Документ.
Там будет всего четыре исключения для типов Начисление, НачальныеОстатки, Коректировка и ОплатаБанк - поле запроса ВидДокуента написать текст. Для всех остальных в это поля пихать что-нибудь типа "Прочее".
   Dmitrii
 
32 - 03.09.21 - 16:05
+ к (31) К тому же это избавляет от конструкции ВЫБОР КОГДА ТОГДА.
   DTX 4th
 
33 - 03.09.21 - 16:05
(22) А в человекосекундах это сколько?) Может, там пара секунд, и ты не туда оптимизируешь)
   unbred
 
34 - 03.09.21 - 16:06
(31) ага, сегодня такое делал.
пипец изврат)
предлагаю удалить составной тип данных из платформы навсегда. (пятница)
   DTX 4th
 
35 - 03.09.21 - 16:09
(30) Не понял. Зачем ты хочешь объедигять по типу документа? Чтобы избавиться от ВЫБОР КОГДА? Сомнительная затея ведь
   Cyberhawk
 
36 - 03.09.21 - 16:09
Какие значения у дат-параметров?
   Dmitrii
 
37 - 03.09.21 - 16:11
(35) Чтобы избавиться от неявных левых соединений со всеми таблицами документов, которые входят в составной тип измерения Документ.
Конструкция ВБОР КОГДА уйдёт при этом сама собой. Но это уже вторично.
   VladZ
 
38 - 03.09.21 - 16:13
(0) Насколько быстро выполняется запрос вида:

 Запрос = Новый Запрос;
            Запрос.Текст =
        "ВЫБРАТЬ
        |    ОборотноСальдоваяОстаткиИОбороты.СумаРасход КАК СумаРасход,
        |    ОборотноСальдоваяОстаткиИОбороты.СумаПриход КАК СумаПриход,
        |    ОборотноСальдоваяОстаткиИОбороты.Документ
        |ИЗ
        |    РегистрНакопления.ОборотноСальдовая.ОстаткиИОбороты(&Дата1, &Дата2, , , &Контрагент = Контрагент) КАК ОборотноСальдоваяОстаткиИОбороты";
   vova1122
 
39 - 03.09.21 - 16:13
(33) зависит от периода (Дата1-Дата2) от 5 до 30 секунд
   vova1122
 
40 - 03.09.21 - 16:14
(27) Из реальной1 таблицы выборка не очень ускорилась (в пределах погрешности)
   toypaul
 
41 - 03.09.21 - 16:15
Чтобы ускорить надо начать с времени выполнения и количества строка
   toypaul
 
42 - 03.09.21 - 16:16
А то может выполняется минуту и возвращает млн строк. Чо тут оптимизировать тогда?

А так стандартные косяки - обращение к вирт. таблице когда можно обратиться к таблице простой и обращение к регистратору через точку вместо обращения к конкретным документам
   DTX 4th
 
43 - 03.09.21 - 16:18
(37) Он сказал, что если убрать Документ.Дата и Документ.Комментарий скорость не увеличится больше чем на 5 процентов. А сама инструкцию ВЫБОР КОГДА + ССЫЛКА не плодит неявных соединений.
Плюс, может у него там тип Документ и так состоит из четырех рахных видом документов)

Если нужно выбирать через точку, то правильнее завести регистр под это дело. Другое обречено на провал, если речь не про киоск
   vova1122
 
44 - 03.09.21 - 16:21
(38) такой вариант почти не ускорил 60-65% против 70-75%
   vova1122
 
45 - 03.09.21 - 16:22
значит уже некуда ускорятся
   youalex
 
46 - 03.09.21 - 16:23
(43) журналы еще есть, но это сильно неуниверсально)
   Мультук
 
47 - 03.09.21 - 16:26
(0)

1) Сколько строк выгружается (количество)
2) Время выполнения 
рез = Запрос.Выполнить();

3) Время выполнения
тз = рез.выгрузить();

4) По полю контрагент есть индекс ?
   RomanYS
 
48 - 03.09.21 - 16:27
(45) абсолютные цифры озвучь. Число строк в результате, время выполнения в сек.
   VladZ
 
49 - 03.09.21 - 16:35
(44) А если получить данные из регистра РегистрНакопления.ОборотноСальдовая.Обороты  ?
Насколько быстрее будет?
   Dmitrii
 
50 - 03.09.21 - 17:02
В данном случае самым быстрым будет работа с таблицей первичных движений.
Любые виртуальные таблицы - только лишняя трата ресурсов и времени.
Если первичная таблица не сильно быстрее работает, то ускоряться дальше просто некуда. Упираемся в архитектурный потолок. Можно ещё побаловаться с собиранием текста запроса из кучи ОБЪЕДИНИТЬ. Если нет, то остаётся пересматривать принцип и подход к реализации или вопрос хранения данных (Дата и Комментарий).
 ВЫБРАТЬ
 СУММА(ВЫБОР
    КОГДА ОборотноСальдовая.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    ТОГДА ОборотноСальдовая.Сумма
    ИНАЧЕ 0
    КОНЕЦ) КАК Приход,
 СУММА(ВЫБОР
    КОГДА ОборотноСальдовая.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    ТОГДА ОборотноСальдовая.Сумма
    ИНАЧЕ 0
    КОНЕЦ) КАК Расход,
 ОборотноСальдовая.Документ КАК Документ
 ПОМЕСТИТЬ Движения
 ИЗ
  РегистрНакопления.ОборотноСальдовая КАК ОборотноСальдовая
 ГДЕ
  ОборотноСальдовая.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
   И ОборотноСальдовая.Контрагент = &Контрагент
   И ОборотноСальдовая.Активность

 СГРУППИРОВАТЬ ПО
  ОборотноСальдовая.Документ

 ИНДЕКСИРОВАТЬ ПО
   Документ
 ;
////////////////////////////////////////////////////////////////////////////////

 ВЫБРАТЬ
  Движения.Приход,
  Движения.Расход,
  Движения.Документ,
  Движения.Документ.Дата,
  Движения.Документ.Комментарий,
  ВЫБОР
    КОГДА Движения.Документ ССЫЛКА Документ.Начисление
        ТОГДА ""Начисление""
    КОГДА Движения.Документ ССЫЛКА Документ.НачальныеОстатки
        ТОГДА ""Остатки""
    КОГДА Движения.Документ ССЫЛКА Документ.Коректировка
        ТОГДА ""Коректировка""
    КОГДА Движения.Документ ССЫЛКА Документ.ОплатаБанк
        ТОГДА ""ОплатаБанк""
    ИНАЧЕ ""Прочее""
  КОНЕЦ КАК ВидДокумента
 ИЗ
  Движения КАК Движения

   lodger
 
51 - 03.09.21 - 17:15
а ещё не использовать Запрос.Выполнить().Выгрузить(); для замеров.
отдельно как в (47) надо.


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.