Имя: Пароль:
1C
1С v8
Запрос с вложенным запросом, где указаны дополнительные условия, работает медленнее
,
0 slafor
 
28.03.20
16:03
В общем-то, вопрос не очень существенный, но интересный. Чисто из темы "хочу все знать" )

Есть запрос, в котором есть вложенный запрос. Например, такой:

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

ГДЕ ОтчетОРозничныхПродажах.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Так вот, если я раскомментирую условие во вложенном запросе (//ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода), то запрос будет выполняться дольше, чем без указания условия. Так и должно быть?

P.S.: Этот запрос ищет ПКО, которые были созданы без указания документа-основания, т.е. вручную. Там еще в условии проверяется, что документ-основание не заполнен.
1 ale-sarin
 
28.03.20
16:11
Проблема возможно в соединении с вложенным запросом
https://its.1c.ru/db/pubqlang#content:155:hdoc
https://its.1c.ru/db/metod8dev#content:5842:hdoc
https://its.1c.ru/db/v8std#content:655:hdoc
2 ДенисЧ
 
28.03.20
16:40
D ghjabkth yt cvjnhtk&
3 ДенисЧ
 
28.03.20
16:40
В профилер не смотрел?
4 Cyberhawk
 
28.03.20
17:29
Это нарушение если и не стандарта разработки, то по крайней мере рекомендации. По умолчанию используй ВТ, т.е. вложенный вынеси в отдельный запрос пакета с созданием ВТ и уже в итоговом запросе соединяйся с ВТ.
5 slafor
 
28.03.20
18:59
(4) Да, я почитал о временных таблицах. Сам их раньше использовал, но только в готовых запросах, где надо было что-то изменить.
Придется весь запрос переписывать, там аж шесть соединений с вложенными запросами. Ну что ж, будет время - займусь )
(3) Для профайлера SQL нужны права администратора сервера? Если да, то труба - у меня их нет...
6 rsv
 
28.03.20
19:15
(0)  а сколько строк в таблице ПКО ?
7 rudnitskij
 
28.03.20
19:28
1) Много раз встречался с ситуациями, когда убирание условия из вложенного запроса ускоряло его выполнение на порядок, а иногда и два.
2) Если вас интересует только наличие/отсутствие документов - выбирайте запросом не ссылку, а другие реквизиты. Номер и дату, например. Выбирая ссылку, вы выбираете весь документ, все его данные. Из вашего PS я так понял, что они вам не нужны
8 ДенисЧ
 
28.03.20
19:30
(7) "Выбирая ссылку, вы выбираете весь документ, все его данные"

https://www.youtube.com/watch?v=l_--ewb4YXg
9 slafor
 
28.03.20
19:33
(6) нужны не все ПКО, а за определенный период. Других условий без данных Отчета о розничных продажах дать не могу, разве что только то, что документ-основание у него должен иметь тип "ДокументСсылка.ОтчетОРозничныхПродажах".
(7) 1). Ну да, я как раз с этим и столкнулся.
2). Все данные мне не нужны, мне нужна только ссылка (шутка :) ). Дело в том, что потом нужно иметь возможность обращаться к самому документу, например, открывать его, получать объект и т.д.
10 slafor
 
28.03.20
19:36
(4) "Это нарушение если и не стандарта разработки, то по крайней мере рекомендации.".
Как вы думаете, если бы я использовал вложенный запрос в соединении на экзамене в 1С, меня бы с экзамена выгнали или просто поставили бы -1? :)
11 rudnitskij
 
28.03.20
19:37
(9) по номеру и дате вполне можно получить документ
12 rudnitskij
 
28.03.20
19:39
(8) https://ibb.co/qYzS52S тут скриншот с замера производительности. Запрос ссылок всех элементов справочника выполняется заметно дольше запроса только лишь их кодов
13 ДенисЧ
 
28.03.20
19:40
(12) А ничего, что там у тебя стоит выгрзука результата запроса?
14 rudnitskij
 
28.03.20
19:41
(13) она в обоих случаях стоит. Что это меняет?
15 ДенисЧ
 
28.03.20
19:42
(14) Мдя... При выгрузке в тз помещается объект из запроса.
Если ты берёшь только код - так и выгружается только код.
А если берёшь  ссылку - так берётся вся ссылка...

Ты меряй скорость не выгрузки, а выполнения запроса... Иначе так и будешь итсы разносить (с)
16 rudnitskij
 
28.03.20
19:43
(15) итсы разносить? какой-то недоступный мне уровень юмора...
17 rudnitskij
 
28.03.20
19:45
(15) "Если ты берёшь только код - так и выгружается только код.
А если берёшь  ссылку - так берётся вся ссылка... "
тебе бы на курсы по запросам записаться чтоле - а то так и будешь обрушивать сервера своими неуклюжими конструкциями, которые выбирают всю ссылку, чтоб из неё потом получить номер документа
18 ДенисЧ
 
28.03.20
19:45
(16) То есть ты до такого ещё не дорос? Завидую. У тебя ещё всё впереди.
А вот у 1с.... С такими погромисстамии

"Судя по вопросам, некоторые не знают и 5%"
19 ДенисЧ
 
28.03.20
19:46
(17) Не.. Мне на курсы по запросам не надо... А вот тебе на курсы по языку 1с...
20 H A D G E H O G s
 
28.03.20
19:52
Чудовища, мутанты, пси-атаки полей,
Выжигатель мозгов, плодящий зомби-людей.
21 H A D G E H O G s
 
28.03.20
19:52
(15) А ведь ты не прав.
22 ДенисЧ
 
28.03.20
19:54
(21) Если я не прав, см. п.1
23 H A D G E H O G s
 
28.03.20
19:54
Выборка ссылки отличается от выборки кода только тем, что в первом случае читается кластерный индекс, а во втором - некластерный (по коду), который читается шустрее.
24 rudnitskij
 
28.03.20
19:54
(18) только что в запросе с объединением двух таблиц заменил выборку ссылки на выборку наименования полного. Время его выполнения в консоли сократилось с 20 секунд до 0.5.
А ты и дальше настаивай на своей бредятине - с которой платформа 1С почему-то не согласна
25 H A D G E H O G s
 
28.03.20
19:55
(23) Что не отменяет дичи нашего западного коллеги.
26 ДенисЧ
 
28.03.20
19:57
(24) То есть ты подтвердил мои утверждения, а виноват оказался я. Ты, случайно, не из Западно Украины, а то, храни нас всех Пресветлая Элберет, из Польши???
27 ДенисЧ
 
28.03.20
19:57
(23) Тю. Ты не понял. Он не просто выбирает ссылку. Он её в тз выгружает...
28 Сияющий в темноте
 
28.03.20
19:58
в новых платыормах в таблицу помещается только ссылка,получение представления идет уже в момент отображения ссылки на экране.
другое дело,что ссылка-это 16 символов гуида,но в процессе она преобразуется в обьект "ссылка" для которого еще и тип задается
а код передается как есть без всяких преобразований
29 H A D G E H O G s
 
28.03.20
19:58
(27) Ну и что.
30 ДенисЧ
 
28.03.20
19:59
(29) Иэтта... опааа...
31 vi0
 
28.03.20
20:38
(0) просто оптимизатор часто оказывается умнее программиста, а программист ему мешает разными условиями
32 vi0
 
28.03.20
20:38
это я серъезно, не пошутил
33 vi0
 
28.03.20
20:41
рекомендую к гуглению: проталкивание предикатов
34 Cyberhawk
 
29.03.20
09:36
(10) На специалисте по платформе - ничего
Закон Брукера: Даже маленькая практика стоит большой теории.