Имя: Пароль:
1C
1С v8
Подскажите как оптимизировать или переписать запрос
0 vova1122
 
03.09.21
15:30
Подскажите как можно переписать или оптимизировать этот запрос чтобы ускорить время его выполнения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ВЫБРАТЬ
СУММА(ВЫБОР
    КОГДА ОборотноСальдовая.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    ТОГДА ОборотноСальдовая.Сумма
    ИНАЧЕ 0
    КОНЕЦ) КАК Приход,
СУММА(ВЫБОР
    КОГДА ОборотноСальдовая.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    ТОГДА ОборотноСальдовая.Сумма
    ИНАЧЕ 0
    КОНЕЦ) КАК Расход,
ОборотноСальдовая.Документ КАК Документ
ПОМЕСТИТЬ Движения
ИЗ
  РегистрНакопления.ОборотноСальдовая КАК ОборотноСальдовая
ГДЕ
  ОборотноСальдовая.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
   И ОборотноСальдовая.Контрагент = &Контрагент
   И ОборотноСальдовая.Активность

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

ИНДЕКСИРОВАТЬ ПО
   Документ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
  Движения.Приход,
  Движения.Расход,
  Движения.Документ,
  Движения.Документ.Дата,
  Движения.Документ.Комментарий,
  ВЫБОР
    КОГДА Движения.Документ ССЫЛКА Документ.Начисление
        ТОГДА ""Начисление""
    КОГДА Движения.Документ ССЫЛКА Документ.НачальныеОстатки
        ТОГДА ""Остатки""
    КОГДА Движения.Документ ССЫЛКА Документ.Коректировка
        ТОГДА ""Коректировка""
    КОГДА Движения.Документ ССЫЛКА Документ.ОплатаБанк
        ТОГДА ""ОплатаБанк""
    ИНАЧЕ ""Прочее""
  КОНЕЦ КАК ВидДокумента
ИЗ
  Движения КАК Движения
51 lodger
 
03.09.21
17:15
а ещё не использовать Запрос.Выполнить().Выгрузить(); для замеров.
отдельно как в (47) надо.