Имя: Пароль:
1C
 
Запрос в цикле
,
0 craxx
 
29.04.19
12:23
Набившая оскомину тема. Запрос в цикле. Когда он выгоднее, чем запрос вне цикла?
У меня на ум приходит только соединение двух больших таблиц, когда много соединений маленьких выполнится быстрее большого соединения.
У кого какие еще примеры?
1 azernot
 
29.04.19
12:26
>Запрос в цикле. Когда он выгоднее, чем запрос вне цикла?

Правильный ответ - никогда.
Если факт противоречит этому,  это говорит о том, что неверно организован запрос вне цикла.
2 xXeNoNx
 
29.04.19
12:27
(0) в комплексе с другими моментами когда количество итераций цикла известна заранее и решение того стоит
3 craxx
 
29.04.19
12:28
(1) неправильный ответ. в моем случае выгоднее именно в цикле. ибо сумма квадратов всегда меньше квадрата суммы
4 xXeNoNx
 
29.04.19
12:28
(1) >> Правильный ответ - никогда.
А обоснования данного тезиса у Вас есть?
5 ptiz
 
29.04.19
12:30
(0) Например, запрос вызывается с такими разными наборами параметров, для которых неэффективно получать всё в одном запросе.
6 xXeNoNx
 
29.04.19
12:30
+(4) (1) Вы просто не умеете их готовить (с)ВР
7 azernot
 
29.04.19
12:35
(3) Не понимаю причём тут это.
(4) Конечно. Как минимум не тратится время на иннициацию запроса, передачу параметров и т.п.

Подчеркну, что сам вопрос подразумевает получение одних и тех же данных единым запросом, или несколькими однотипными запросами к одному источник в цикле. Речь не идёт о каком-то прикладном цикле, когда сам цикл скорее является инструментом для перебора разных источников.

Т.е. если я устрою цикл из 4-х элементов (УУ, БУ, НУ, МУ) и далее отдельно формирую запросы к разным данным, я не считаю это "запросом в цикле".
8 xXeNoNx
 
29.04.19
12:42
(7) >> я не считаю это "запросом в цикле"
о как.., тут - это запрос в цикле, там нет
Еще один пример: получение различных начислений по сотруднику так же не не запрос в цикле?
9 exwill
 
29.04.19
12:43
(0) Запрос в цикле практически всегда лучше, чем решение той же задачи через запрос вне цикла.
1. Лучше использовать явный цикл, чем неявный. Это понятнее и нагляднее.
2. Оптимизировать надо там, где есть потребность в оптимизации.
3. Незачем потакать лени разработчиков платформы. В чем проблема выносить запросы из циклов на уровне платформы? Разве не этим она должна заниматься?
10 H A D G E H O G s
 
29.04.19
12:44
(0) Когда есть составное поле и ты не знаешь все его типы до выполнения запроса.
11 craxx
 
29.04.19
12:44
(10) Плюсану. Только что об это подумал
12 H A D G E H O G s
 
29.04.19
12:49
(9) вам лучше продолжать писать в политике.
13 azernot
 
29.04.19
12:54
(8) Хорошо скажем так, я под "запросом в цикле" подразумеваю один и тот же запрос (или с очень минимальными правками) в который передаются разные параметры, перебираемые в цикле. Т.е. цель цикла - именно в переборе параметров.

В остальных случаях, когда цикл нужен просто для более удобной и универсальной компоновки текста запроса, перебора источников и т.п. я не считаю это "запросом в цикле", это просто метод программирования. И тут ответ на вопрос в (0) зависит от очень многих факторов, что на него просто невозможно ответить "вообще и в целом".
14 xXeNoNx
 
29.04.19
13:03
(13) так точно -> (2) + (6)
Но однозначно сказать что запрос в цикле это плохо - нельзя!
15 craxx
 
29.04.19
18:38
(14) У большинства другое мнение)
16 polosov
 
29.04.19
20:25
(0) Он выгоднее тогда, когда надо решить задачу, но ты не знаешь как сделать без него.
(10) Надо строить запрос кодом.
(9) Я надеюсь это ты тралишь, а не выражаешь свое профессиональное мнение.
Однозначно, выборка  данных единым запросом лучше, чем дергание СУБД постоянными запросами поменьше, ибо возрастает вероятность блокировок.
17 H A D G E H O G s
 
29.04.19
20:27
(16) В смысле - запрос - кодом?
18 H A D G E H O G s
 
29.04.19
20:29
Я вот про это:

Выбрать Продажи.Регистратор.Номер как НомерДокумента
из РегистрНакоплений.Продажи как Продажи
Где Продажи.Период>&НачалоМесяца

его нужно заменить на
Выбрать Продажи.Регистратор как НомерДокумента
из РегистрНакоплений.Продажи как Продажи
Где Продажи.Период>&НачалоМесяца

и постобработкой получить номера, с числом запросов= количеству различных типов регистратора.
19 polosov
 
29.04.19
20:29
(17) Всмысле в зависимости от входных данных (например, анализа метаданных) строишь тело запроса. Что-то мне не верится, что для тебя такое в новинку
20 polosov
 
29.04.19
20:32
(18) В зависимости от типов своих регистраторов делаешь

Выбрать ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ТВОЙ_ТИП_ДОКУМЕНТА).Номер как НомерДокумента
из РегистрНакоплений.Продажи как Продажи
Где Продажи.Период>&НачалоМесяца
ОБЪЕДИНИТЬ ВСЕ
и тд и тп
21 H A D G E H O G s
 
29.04.19
20:42
(20) Откуда ты узнаешь, какие типы регистраторов попали в выборку ДО выполнения запроса?
22 H A D G E H O G s
 
29.04.19
20:44
Выбрать ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ТВОЙ_ТИП_ДОКУМЕНТА).Номер как НомерДокумента
из РегистрНакоплений.Продажи как Продажи
Где Продажи.Период>&НачалоМесяца
ОБЪЕДИНИТЬ ВСЕ

легко заменяется на


ВЫБОР КОГДА Продажи.Регистратор ССЫЛКА Документ.ТВОЙ_ТИП_ДОКУМЕНТА1 ТОГДА
ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ТВОЙ_ТИП_ДОКУМЕНТА1).Номер
КОГДА Продажи.Регистратор ССЫЛКА Документ.ТВОЙ_ТИП_ДОКУМЕНТА2 ТОГДА
ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ТВОЙ_ТИП_ДОКУМЕНТА2).Номер
23 polosov
 
29.04.19
20:54
(21) Хорошо. Если у тебя такая задача, то держи.
1. Кодом получаешь типы регистраторов.
2. Строишь запрос.
(22) Да, можно и так.
24 H A D G E H O G s
 
29.04.19
20:57
(23) Каким кодом?
25 H A D G E H O G s
 
29.04.19
20:58
(23) "Да, можно и так."

Весело там у вас.
26 polosov
 
29.04.19
20:58
(24) запрос для поисковой машины: "Как получить типы регистраторов в регистре накопления"
27 polosov
 
29.04.19
21:01
(25) Вот тут не совсем понимаю. Хочешь сказать, что case сильно оптимальнее union?
28 H A D G E H O G s
 
29.04.19
21:02
(26) Ты прикалываешься?
Еще раз вчитайся внимательно во фразу
"Откуда ты узнаешь, какие типы регистраторов попали в выборку ДО выполнения запроса?"
29 polosov
 
29.04.19
21:03
(28) ХЗ, может ты прикалываешься? У тебя нет доступа к РН до выполнения запроса?
30 H A D G E H O G s
 
29.04.19
21:03
(27) union потребует x поисков по таблице, где x - количество типов регистраторов с последующим merge
31 polosov
 
29.04.19
21:05
(30) Ты вроде с планами дружишь. Можешь быстренько глянуть? Я просто, утверждать не берусь, но подглядел такие union на взрослых системах еще во времена обучения.
32 H A D G E H O G s
 
29.04.19
21:05
(29)
с 1 января по 31 января были только ПТУ.
1 февраля были только РТУ.
У нас выборка с 2 февраля.
Вопрос - надо ли трогать таблицу ПТУ?
33 polosov
 
29.04.19
21:07
(32) А что-то изменится, если в union all попадет выборка из РН по типу регистратора, которого нет за это период?
34 H A D G E H O G s
 
29.04.19
21:08
Вот жесть жеж.
35 polosov
 
29.04.19
21:10
(34) Не ну тебе виднее, ты же собак много съел на запросах.
36 polosov
 
29.04.19
21:12
(34) Мне просто нравится твоя жесть. Вытащить регистраторы запросом, а потом из выборки вытащить типы регистраторов, а потом построить запросы.
37 H A D G E H O G s
 
29.04.19
21:15
(36) Рекомендую собрать план запроса в какой-нибудь ERP для

ВЫБРАТЬ ПЕРВЫЕ 10
    ДвиженияСерийТоваров.Регистратор.Номер КАК РегистраторНомер
ИЗ
    РегистрНакопления.ДвиженияСерийТоваров КАК ДвиженияСерийТоваров
38 DomovoiAtakue
 
29.04.19
21:25
(0)Когда есть уже готовые запросы и их вызовы не создают видимые тормоза. Лучше использовать уже готовые запросы как например ПолучитьЦену() чем каждый раз клепать что-то свое. Все пишут запросы в цикле, странно, что кто-то еще говорит: "Запросы в цикле - зло".
39 Garykom
 
гуру
29.04.19
21:31
(38) Странно это не понимать и не стараться избегать всеми силами.
Там только на передаче данных туда-сюда между сервером 1С и sql сервером куча накладных расходов.
40 H A D G E H O G s
 
29.04.19
21:37
41 H A D G E H O G s
 
29.04.19
21:37
42 H A D G E H O G s
 
29.04.19
21:38
Критикуешь - предлагай?!
Несомненно:
https://youtu.be/fEYceCWI_h0
43 polosov
 
29.04.19
21:42
(37) У тебя вроде маркировка больная тема, отсюда и отсылки к своим любимым сериям. Но я человек простой, запросы строю за деньги.
(40) , (41) , (42)  Ты уже принял писят грамм "чтобы спалось лучше"? ))
44 polosov
 
29.04.19
21:43
(37) И да, традиционно: опиши задачу, возможно ты решаешь ее не правильно.
45 Garykom
 
гуру
29.04.19
21:45
(36) >Вытащить регистраторы запросом, а потом из выборки вытащить типы регистраторов, а потом построить запросы.
(43) >У тебя вроде маркировка больная тема, отсюда и отсылки к своим любимым сериям. Но я человек простой, запросы строю за деньги.

Типовые конфы, метаданные сильно не исправишь, приходится выкручиваться чем можно.
Ибо работать то надо на то что есть.
46 H A D G E H O G s
 
29.04.19
21:46
(45) Можно денормализовать, но устроила постобработка.
47 Garykom
 
гуру
29.04.19
21:47
(46) Блин напомнил про хитрый хак.
Когда вместо исправления головоломного запроса на несколько экранов.

Тупо и банально после него подсовываем (в т.ч. кодом) что надо для отчета.
48 Garykom
 
гуру
29.04.19
21:48
(47)+ В результат после выполнить подсоваем
49 Garykom
 
гуру
29.04.19
21:48
(48) тьфу *подсовываем или изменяем данные как надо.
50 polosov
 
29.04.19
21:51
(47) Да все мы, бывает, говнокодим.
51 H A D G E H O G s
 
29.04.19
21:58
(50) нет.
52 DomovoiAtakue
 
29.04.19
21:59
(39)Избегать запросов в цикле?
53 polosov
 
29.04.19
22:01
(51) Ой не смеши.
54 exwill
 
29.04.19
22:59
(16) Я вроде бы достаточно ясно выразился.
Простота кода важнее производительности, которую, в идеале, должна обеспечивать платформа.
55 palsergeich
 
29.04.19
23:09
Пример, ранее обсосанный на форуме:
Получить всех родителей элемента в иерархическом справочнике, если глубина иерархии неизвестна, и считается что может быть большой (больше 10).
56 craxx
 
30.04.19
05:35
(54) ты это пользователям потом расскажешь, которые спросят за тормоза
57 craxx
 
30.04.19
05:36
(55) пример не совсем корректный ибо он изначально запросом не решается
58 Лодырь
 
30.04.19
05:54
59 craxx
 
30.04.19
05:56
(58) Я знаю эту тему, пробовал собирать запросом, по скорости полный трэш, собрал программно в 20 раз быстрее.
60 Лодырь
 
30.04.19
06:05
(59) Ну так palsergeich и написал что быстрее ) Но ведь можно же.
61 seevkik
 
30.04.19
06:36
В чем заключается выгода?)

Как-то надо было добавить поле со значением дополнительного реквизита, подумав "надо сделать все шикарно", я менял запрос в документе (не самый сложный, но далеко не простой), делов на 10 минут, как раз расширения стали популярны - добавил в расширение, поменял все в запросе, получил допреквизит, вроде по феншую.
Периодически, при обновлении, этот участок кода менялся, иногда запрос, иногда код, доработка совсем мелкая, малозначимая, каждый раз мне приходилось заново в нее вникать, частенько я про нее забывал - тогда приходили тикеты, они отнимали мое время, мешали зависать на формуах тыжпрограммистов, смотреть на котиков в тырнетах, тратили силы и нервы. Я не мог больше работать. Я был в депрессии. Однажды мне это надоело. В цикле этого запроса воткнув "УправлениеСвойствами.ЗначениеСвойства" я получил большую выгоду в виде времени, с тех пор жизнь начала налаживаться, трава стала зеленее, солнце ярче, и я понял что запросы в цикле это не плохо
62 Провинциальный 1сник
 
30.04.19
06:40
Когда делаешь запрос в цикле - ты можешь легко оценить оставшееся до завершения алгоритма время. В случае же, если мегазапрос выполняется sql-сервером, ты не видишь никакого прогресса, программа тупо "висит". Для пользователя приятнее видеть прогресс-бар минуту, чем полминуты зависшее окно.
63 Simod
 
30.04.19
07:30
(0) Когда необходимо ограничить размер выборки и обрабатывать по частям:

<CODE>
ВЫБРАТЬ ПЕРВЫЕ 1000
...
</CODE>
64 Prog111
 
30.04.19
07:59
Выгоднее в случаях:

1) Алгоритм будет использоваться редко (какая-нибудь разовая обработка, отчет, запускающийся раз в полгода).
2) Количество циклов предсказуемо и небольшое (например, количество районов в городе 4-5) и не влияет особо на скорость исполнения алгоритма.
3) Разработка более сложного кода (без циклов) будет более затратна, чем эффект от экономии использования более оптимального кода.
65 Dotoshin
 
30.04.19
08:17
(0) Есть ситуации, когда запрос в цикле не выгоднее, а единственно возможное решение. Например разузлование спецификации номенклатуры или построение дерева затрат без СКД.
Может я конечно чего-то не знаю, поэтому если есть способ без цикла и без СКД, то прошу поделиться.
66 H A D G E H O G s
 
30.04.19
10:13
(62) включи ему gif-ку
67 Успехов
 
30.04.19
10:15
(65) Когда ты знаешь максимальную глубину вложенности можно и без запроса в цикле.
68 kolts23381
 
30.04.19
10:26
А что насчет запросов в цикле из временных таблиц?
69 Конструктор1С
 
30.04.19
10:28
Запрос в цикле допустим, если он:
а) не губит производительность
б) делает код проще и удобочитаемее, по сравнению с запросом "по феншую"
70 Вафель
 
30.04.19
10:28
(65) скд теже циклы крутил. или раз я не пишу слово цикл - значит я молодец?
71 Sammo
 
30.04.19
10:33
Была ситуация (правда еще на 8.1 и 8.2) когда выборка более 1млн записей падала. А поскольку требовалось сформировать данные за месяц (порядка 20млн записей), то приходилось разбивать месяц по периодам и формировать кусками.
72 stix2010
 
30.04.19
10:55
а давате похоливарим на тему запросы в цикле от разработчиков типовых?
73 Nikoss
 
30.04.19
11:14
(69) если (а) никогда не выполняется, смысл писать про (б)?
74 Nikoss
 
30.04.19
11:18
(71) зачем нужна выборка на 1млн (или темболее 20млн) записей? Что с ними делать?
75 Конструктор1С
 
30.04.19
11:33
(73) в каком смысле не выполняется? У производительности тоже есть границы разумного. Допустим, в справочнике заведомо 100 элементов, за раз нужно получить 5 элементов. Тут совершенно пофиг, как ты там будешь получать эти данные из справочника, хоть через точку, хоть запросами в цикле, хоть "оптимальным" запросом, ибо всё оно будет выполняться моментально. Ну перепишешь ты запрос оптимально, выиграешь 0,00003 секунды, а пользователь этого никогда не заметит. Что это даст?
В то же время попытки получить данные одним большим запросом заведомо усложняют решение.
76 Вафель
 
30.04.19
11:36
если данных слишком много, то за запрос без цикла ручки то нужно вырывать
77 Nikoss
 
30.04.19
11:41
(75) ок, тогда пункт (а) из (69) нужно разворачивать - "..., в границах разумного". Только у каждого свое понимание разумного. Какое понимание, допустим, у экзаменаторов 1С?
78 Nikoss
 
30.04.19
11:42
(76) ты мне про (74)?
79 Конструктор1С
 
30.04.19
11:55
(77) у экзаменаторов 1С какие-то свои представления о производительности. "Вот вам база из двух справочников по три элемента в каждом, пишите оптимальные запросы"
пункт (а) из (69) разворачивать не нужно. Затраты в лишние 0,005 секунд на всю операцию субъективно никак не влияют на производительность. Такого "ухудшения производительности" никто и никогда не заметит. В то же самое время, не рентабельно тратить часы на оптимизацию и делать код менее читабельным, ради сомнительного выигрыша в 0,005 секунд. Всегда должен быть баланс между "легкостью" и производительностью кода
80 Nikoss
 
30.04.19
12:14
(79) 0.005 сек - ок. А 0.5 сек? А 1 сек?
Опять же, в контексте чего мы говорим: одно дело ночная регламентная процедура, и совсем другое когда пользователь жмет кнопку добавить в таб.части.
81 stix2010
 
30.04.19
12:22
(79) мне кажется это самое логичное, если производительность не критична, то выигрывает скорость разработки.
82 Провинциальный 1сник
 
30.04.19
12:23
(66) Котик не вариант, прогресс должен быть информативным, дающим возможность оценить время, на которое пользователь может отвлечься)
83 Вафель
 
30.04.19
12:42
(79) на экзамене проверяют твое умение писть запросы не только в цикле
84 Nikoss
 
30.04.19
12:47
(81) скорость разработки и производительность - палка о двух концах. На момент разработки, процедура с запросом в цикле может выполняться мгновенно, а после, условного, года наполнения таблиц данными - вечность.
85 Провинциальный 1сник
 
30.04.19
12:48
(84) А бывает и наоборот.
86 Конструктор1С
 
30.04.19
13:04
(80) даже при интерактивном действии пользователь не заметит потерь в доли секунды
(83) про "только в цикле" никто и не говорит. Скажем так, запрос в цикле иногда допустим, а маниакальное избавление от запросов в цикле приводит к неимоверному усложнению кода.
(84) это уже вопрос прогнозирования объема данных и тестирования производительности
87 oslokot
 
30.04.19
13:12
(62) один хрен форма зафризится, будь то запрос в цикле или один мега-запрос
Все равно надо выполнять в фоне, а пользователю - кота
88 Ник080808
 
30.04.19
13:59
(79) "Всегда должен быть баланс между "легкостью" и производительностью кода"+100500. Все зависит от ситуации. А то иногда месяц ваяют запрос без цикла, который собственно раз в году понадобится и сэкономит пользователю пару минут. по итогу затраты на разработку окупаются спустя десять лет экплуатации системы)
89 Dotoshin
 
30.04.19
14:34
(88) Когда разрабатывается тиражной решение, то не известно сколько раз в году будет выполняться запрос и сколько пользователей одновременно будут его выполнять и сколько пользователей и как долго будут пытаться заблокировать таблицы, которые читает запрос тоже неизвестно. Вот поэтому и требуют писать оптимально и без циклов.
А когда делаешь отчетик для тети Мани, которая раз в год его запустит, то можешь хоть в цикле, хоть через три точки к данным обращаться...
90 Ник080808
 
30.04.19
15:47
(89) так о том и речь, что многие воспринимают как догму рекомендации. мы пишем бизнес приложение и нужно оценивать задачу с точки зрения выгоды бизнеса. Тиражные решения пишут единицы, основная масса допиливает типовые или нетленки под конкретное предприятие. Поэтому нужно понимать, что дешевле - полдня работы 1снега или пять минут работы оператора ПК и от этого и отталкиваться - стоит заморачиваться с запросом или стоит наговнокодить.
91 Сияющий в темноте
 
30.04.19
17:07
Начнем с того,что 1с не умеет prepare  execute,что позволякт без.проблем гонять запросы в цикле.
без этой особенности,мы получаем,что на каждый запрос выполняется построение плана,а это трата времени и лишняя нагрузка на сервер.

однако,например,во всех конфигурациях,где есть регист ЦеныНоменклатуры,есть функция ПолучитьЦену,которая вызывается в цикле по таблице товароа,а это и есть запрос в цикле
92 Вафель
 
30.04.19
17:11
(89) а потом когда в этот мега запрос нужно поле добавить - плюешься на разрабов типовых
93 Ник080808
 
30.04.19
19:45
(92) схема запросов рулит. я тут для себя открыл ее прелесть. Офигенный запрос собирается по 100500 процедурам в 100500 модулям. мучался мучался, потом перед передачей запроса в текст запроса прописал передачу в схему запроса, добавил нужное поле и обработанный текст отдал запросу. песТня!
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший