|
Подскажите как оптимизировать или переписать запрос | ☑ | ||
---|---|---|---|---|
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
|
Видос по теме
https://www.youtube.com/watch?v=VfJKdap3ZwY |
|||
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
|
В данном случае самым быстрым будет работа с таблицей первичных движений.
Любые виртуальные таблицы - только лишняя трата ресурсов и времени. Если первичная таблица не сильно быстрее работает, то ускоряться дальше просто некуда. Упираемся в архитектурный потолок. Можно ещё побаловаться с собиранием текста запроса из кучи ОБЪЕДИНИТЬ. Если нет, то остаётся пересматривать принцип и подход к реализации или вопрос хранения данных (Дата и Комментарий).
|
|||
51
lodger
03.09.21
✎
17:15
|
а ещё не использовать Запрос.Выполнить().Выгрузить(); для замеров.
отдельно как в (47) надо. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |