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

Чем плох запрос в цикле??

[Волшебник, 22.11.21 - 10:45]
Чем плох запрос в цикле??
Я
   dubolom
 
22.11.21 - 08:26
В самом деле, пару раз слышал, что это - плохо. Но вот пример! Допустим, надо получить из регистра сведений ЦеныНоменклатуры цены по всей номенклатуре и нескольким складам.
Номенклатуру-то одним запросом выдернуть не проблема, но вот по каждому складу надо свой запрос формировать. То есть, во-первых, это необходимо, а во-вторых, ничем не плохо. Говорят, якобы тормозит сильно, но у меня выполняется моментально.
Зачем огород городить с запретом запросов в цикле?
   ГеннадийУО
 
1 - 22.11.21 - 08:28
(0) Это смотря какой запрос, и какой цикл :)
   Обработка
 
2 - 22.11.21 - 08:28
(0) Если не критично то можно юзать запрос цикле.
А вот если все можно одним запросом вытащить потом просто юзать почему бы не сделать?
   DGorgoN
 
3 - 22.11.21 - 08:28
(0) По каждому складу тоже не проблема. Проблема когда запросы уж очень сложные. Тогда их построение вызывает вопросы.
   МимохожийОднако
 
4 - 22.11.21 - 08:31
(0) Достаточно сделать замеры, чтобы определиться. Зависит от конкретной базы и её заполненности.
Огород делают, чтобы его не затоптали. Если некому топтать, то можно и без огорода.
   Обработка
 
5 - 22.11.21 - 08:35
Если циклов 1-2-3 Ну пусть даже 10 раз и это оправдано логикой обработки данных запроса то можно.
А вот если у тебя в цикле уже 100-200 раз запрос с неким параметром отбора то это гов-код. Стыдно за такое.
   Merkalov
 
6 - 22.11.21 - 08:38
Из любого правила есть исключения. Не стоит повторять это как мантру "запросы цикле запрещены...запросы в цикле запрещены". Но у автора похоже не этот случай:)
   ГеннадийУО
 
7 - 22.11.21 - 08:47
(2) Внезапно, запрос в цикле может оказаться быстрее одного запроса :)
   dmpl
 
8 - 22.11.21 - 09:01
(0) Он плох тем, что те, кто задает такие вопросы, обычно получают медленно работающий код через 1-2 года эксплуатации базы. Или раньше.
   Chai Nic
 
9 - 22.11.21 - 09:02
(8) Или не получают. Зависит от запроса. И от цикла. )
   Garykom
 
10 - 22.11.21 - 09:05
(7) Нет
Правильный запрос в цикле может оказаться быстрее кривого и запутанного одного запроса
   Garykom
 
11 - 22.11.21 - 09:06
Язык запросов прекрасно позволяет используя составные запросы и ВТ организовать цикл(ы) унутри субд
   acht
 
12 - 22.11.21 - 09:07
(0) Запрос в цикле плох тем, что своим существованием дает скучающим пищу для троллинга.
И ты еще голосовалку прикрутить забыл.
   dmpl
 
13 - 22.11.21 - 09:09
(9) Не, они - получают. Если только не в ларьке, где хватило бы Excel.
   Strogg
 
14 - 22.11.21 - 09:10
(0) Глянь план построения какого нибудь тяжелого запроса, который строит кластер к базе sql и умножь его она количество итераций. И тогда увидишь, что будет эффективнее - либо каждую итерацию строящийся план запроса, либо запрос к БД 1 раз.
Но тут правильно сказали, что все зависито от цикла и от запроса.
   acht
 
15 - 22.11.21 - 09:12
(14) Не корми
   Garykom
 
16 - 22.11.21 - 09:15
теоретически субд может быть кластерная и можно цикл на разные потоки разбить да
   Garykom
 
17 - 22.11.21 - 09:16
Кстати!

Когда в 1С появятся запросы на запись? Ну хотя бы для РС?
   Chai Nic
 
18 - 22.11.21 - 09:17
(11) Язык запросов позволяет положить sql-сервер соединением журнала проводок самим с собой без условия. Тоже неплохо.
   ГеннадийУО
 
19 - 22.11.21 - 09:17
(10) Не всегда можно для простого запроса для одного набора параметров построить эффективный запрос для нескольких наборов параметров.
   Ненавижу 1С
 
20 - 22.11.21 - 09:26
Запрос в цикле обычно медленнее адекватного одного запроса.
Запретов нет прямых, можно использовать, но с оглядкой, что может просесть производительность.
Преждевременная оптимизация зло, но в 1С к коду редко возвращаются из-за оптимизации.
Если складов 5, то может и норм, а если это 100500 товаров, то нет.
   mikecool
 
21 - 22.11.21 - 09:31
запрос в цикле - это нарушение принципа чистого кода, который ты так провозглашаешь в своей разработке
   Garykom
 
22 - 22.11.21 - 09:33
(19) Это пока не умеешь в запросы
   xkanix
 
23 - 22.11.21 - 09:34
(17) Скорее всего никогда :(
Ведь должна же "бизнес логигка" отрабатывать.
   Garykom
 
24 - 22.11.21 - 09:35
(23) а как же случаи "ОбменДанными.Загрузка = Истина" ?
   dmpl
 
25 - 22.11.21 - 09:36
(24) Это просто пожелание. Некоторый код выполняется и в этом режиме.
   Garykom
 
26 - 22.11.21 - 09:36
(24)+ Да в РС можно прямыми запросами лить, но это не комильфо
   Simod
 
27 - 22.11.21 - 09:39
(0) Тем, что возникает многократное обращение сервера 1С к СУБД.
Чаще всего подобное возникает в неявном виде - обращение к реквизитам объекта в выборке, которые можно было выбрать в основном запросе.

Есть вполне осознанное применение запроса в цикле - порционная обработка большого объема данных.

(17) Зачем?
   youalex
 
28 - 22.11.21 - 09:40
(27) delete where как вариант
   Ненавижу 1С
 
29 - 22.11.21 - 09:40
(26) например в узлах обмена не будет регистрации
   NorthWind
 
30 - 22.11.21 - 09:40
(0) оно в каждом конкретном случае необязательно плохо. Но есть практика, которая показывает, что количество итераций цикла со временем может измениться в большую сторону, а количество данных для обработки запросом - увеличиться, что теоретически может привести к проблемам с производительностью. Поэтому рекомендуют лишний обращать внимание на оправданность такого решения и по возможности его избегать.
 
 
   SleepyHead
 
31 - 22.11.21 - 09:41
(0) Как вариант - объединить тексты запросов, получится один запрос.
   ADirks
 
32 - 22.11.21 - 09:47
Когда разум подменяют верой, то это хорошо, ибо уменьшает энергетические затраты на процесс мышления.
   Garykom
 
33 - 22.11.21 - 09:50
(32) Ты не путай
Аксиома это тоже вера
Использовать готовые формулы, которые придумали и проверили другие люди, без собственной перепроверки тоже вера
Вопрос только во что и кому верить
Умным людям или жрецам
   acht
 
34 - 22.11.21 - 09:52
(33) > и проверили
Вот тут как раз отличие веры от доверия
   Garykom
 
35 - 22.11.21 - 09:53
(34) корень то один и суть одна
   Zapal
 
36 - 22.11.21 - 09:54
я считаю что если выигрыш в производительности незаметен, то на первый план должна выходить простота и читаемость кода. Ибо именно эта вещь как правило представляет проблему, а не производительность

с этой точки зрения запросы в цикле вполне допустимая вещь, если они не приводят к просадкам производительности и с ними получается более понятный и надёжный код
   ADirks
 
37 - 22.11.21 - 09:55
(35) слова похожие, а суть радикально разная
   Garykom
 
38 - 22.11.21 - 09:55
   ADirks
 
39 - 22.11.21 - 09:57
(33) и кстати аксиома, это не бездоказательное утверждение. Это утверждение типа "предположим, что ..." и далее на этом утверждении что-то строится. Никто не постулирует абсолютной истины в таких построениях.
   Garykom
 
40 - 22.11.21 - 09:58
(39) "предположим что высшая сущность есть" так?
   Dmitrii
 
41 - 22.11.21 - 09:58
(24) >> а как же случаи "ОбменДанными.Загрузка = Истина"?

Так в том то и дело, что ОбменДанными.Загрузка не отменяет полностью работу бизнес-логики. В коде может быть отключена только часть бизнес-логики по этому флагу, а может быть даже наоборот - настроено выполнение каких-либо дополнительных действий.
Если дать запросы на запись, то встанет проблема - как решать вопросы выполнения обработчиков событий объектной модели.
Не то чтобы это вообще невыполнимо. Но, как мне кажется, это неоправданно усложнило бы систему с соответствующим добавлением непредсказуемости и неконтролируемости.
Если сейчас, придя к заказчику и впервые увидев его конфигурацию, я точно могу быть уверенным, что при записи того или иного объекта отработает та или иная логика. То в случае наличия запросов на запись можно ожидать, что в любой момент в конфе может появиться какая-нибудь обработка, которая будет писать объекты напрямую в БД запросами в обход абсолютно любой логики.
   sikuda
 
42 - 22.11.21 - 09:58
(35)(40) Такое надо уже собирать на свой канал - https://youtu.be/orBGBSn6XRE?t=36
   Simod
 
43 - 22.11.21 - 10:00
(28) Большинство 1С-ников запросы на выборку писать не умеют.
   ADirks
 
44 - 22.11.21 - 10:00
(40) да, вполне можно такое предположить
   ГеннадийУО
 
45 - 22.11.21 - 10:01
(22) Ну да, конечно :)
   dubolom
 
46 - 22.11.21 - 10:02
В общем очевидно что никто не смог толком сформулировать чем плохи зопросы в цикле.
Потому что на самом деле они вполне такие же.
Все перешли на высокие материи.
   Garykom
 
47 - 22.11.21 - 10:04
(44) аксиома :)
   dmpl
 
48 - 22.11.21 - 10:05
(46) См. (8). Использовать запросы в цикле может только тот, кто может обходиться без запросов в цикле.
   K1RSAN
 
49 - 22.11.21 - 10:05
(0) А почему для каждого склада отдельный запрос надо? Там разные поля нужны? Почему нельзя просто сделать группировку склад-номенклатура, и просто запрос обходить 2 циклами вложенными по складу, а внутри склада по номенклатуре? Как минимум в двойке видел такие запросы, в тройке, конечно, накрутили кучу ВТ...
   acht
 
50 - 22.11.21 - 10:05
(46)
"Стыдиться надо такие вопросы здесь задавать"
(С) dubolom, Посчитать сколько дней осталось дня рождения начиная с этого дня
   Garykom
 
51 - 22.11.21 - 10:06
(46) для простоты проще принять на веру "запросы в цикле плохо" и все
и всегда стараться по максимуму сделать одним запросом

но если запрос становится слишком сложным для понимания на несколько экранов это тоже плохо
   Dmitrii
 
52 - 22.11.21 - 10:06
(39) >> Никто не постулирует абсолютной истины в таких построениях.

Аксиома и постулат вообще-то синонимы.
Аксио́ма (др.-греч. ἀξίωμα «утверждение, положение»), или постула́т (от лат. postulatum — букв. требуемое), — исходное положение какой-либо теории, принимаемое в рамках данной теории истинным без требования доказательства и используемое при доказательстве других её положений, которые, в свою очередь, называются теоремами.

Единственная особенность - что аксиома принимается за истину только в рамках конкретной теории. Аксиомы ньютоновской механики могут быть неверны в рамках квантовой физики.

Возвращаясь к теме. "Не писать запросы в цикле" никак не может быть аксиомой или постулатом. Это всего лишь общее правило или рекомендация, из которых могут быть исключения. Исключения как оправданные производительностью, когда простой запрос в цикле будет работать быстрее большого и сложного. так и чисто практическими соображениями, например, при написании какой-нибудь одноразовой обработки, скорость выполнения которой не имеет никакого значения, а скорость написания и отладки кода может значительно вырасти из-за надуманной необходимости строго следовать подобным правилам.
   K1RSAN
 
53 - 22.11.21 - 10:07
(46) Использовать запросы в цикле - это как не настраивать архивацию на другие носители. Кто-то может всю жизнь так работать и не иметь проблем, но стоит 1 раз положить базу - повторить не хочется
   Casey1984
 
54 - 22.11.21 - 10:08
(0) Плох тем, что это потенциально узкое место, и если можно исправить, то нужно ;-)
   Garykom
 
55 - 22.11.21 - 10:10
(54) именно

и ни в коем разе не надо логику (алгоритм) кода делать на запросах в цикле
ибо будет сложно оптимизировать убрав узкое место
   Casey1984
 
56 - 22.11.21 - 10:12
   Сергиус
 
57 - 22.11.21 - 10:13
(0)Это не плохо, а неоптимально. Из аналогии, примерно тоже самое как поднять сразу много грузов в лифте на 10-й этаж и там спокойно все разгрузить или же носить пешком по одному грузу туда-сюда. Если позволяют время и средства, то пожалуйста)
   ADirks
 
58 - 22.11.21 - 10:14
(47) в качестве аксиомы вполне нормально, можно всякого на этом основании нагородить, не возражаю.
правда, конкретно с этим утверждением есть проблема - его принципиально нельзя проверить.
   dubolom
 
59 - 22.11.21 - 10:16
Это всё лирика.
У меня прекрасно моментально работает запрос в цикле.
   Волшебник
 
Модератор
60 - 22.11.21 - 10:17
У профессионалов запросы в циклах не тормозят.
 
 
   ГеннадийУО
 
61 - 22.11.21 - 10:17
(59) А тут все надеются, что с ростом бизнеса перестанет :) А если бизнес уже не растёт, то и не перестанет :)
   Dmitrii
 
62 - 22.11.21 - 10:17
(59) Не у тебя одного.
   dmpl
 
63 - 22.11.21 - 10:18
(59) Попробуй взять базу хотя бы на 300-500 Гб.
   acht
 
64 - 22.11.21 - 10:18
(60) Профессионалы таких "обсуждений" не устраивают
   Волшебник
 
Модератор
65 - 22.11.21 - 10:19
(64) Профессионалы умеют делать замер производительности и смотреть план выполнения запроса.
   dubolom
 
66 - 22.11.21 - 10:19
(64) У меня есть 1с: Профессионал
   ГеннадийУО
 
67 - 22.11.21 - 10:19
(63) У меня база 12 ТБ... Не тормозят :(
   Dmitrii
 
68 - 22.11.21 - 10:20
Лучше бы провели опрос, где каждый должен привести конкретные примеры таких запросов чья производительность в цикле была бы хотя бы не ниже, чем решение аналогичной задачи одном запросом. С замерами и объяснениями.
А так получается какое-то бесконечное бла-бла-бла ни о чём.
   ГеннадийУО
 
69 - 22.11.21 - 10:21
(68) А смысл? Это будут специфические случаи, которые человек со стороны без погружения в контекст не поймёт.
   Волшебник
 
Модератор
70 - 22.11.21 - 10:21
(66) Я писал вопросы к тесту 1С Профессионал, а Вы засоряете форум глупыми ветками. Вам не стыдно?
   Сергиус
 
71 - 22.11.21 - 10:23
(59)В 90% случаев можно сделать более оптимально)
   acanta
 
72 - 22.11.21 - 10:23
(57) если время разноски одного пакета по этажу превышает время движения лифта и во время погрузки лифта все двери на всех этажах закрываются, то запрос в цикле норм.
Вероятно это вопрос блокировок, но это не точно.
   МимохожийОднако
 
73 - 22.11.21 - 10:24
(57) Хорошая аналогия )
   TheRoofIsOnFire
 
74 - 22.11.21 - 10:27
Каждый месяц подобная ветка, запросы в циклах это плохо, но во всех типовых они есть в каждом документе. И вообще это беда всех ORM, orm - это там где обращение к таблицам идет через точку.
   Kassern
 
75 - 22.11.21 - 10:27
очередной клон Калимулина?
   Garykom
 
76 - 22.11.21 - 10:28
(73) а если лифтов больше чем грузов и носильщиков?
   Casey1984
 
77 - 22.11.21 - 10:29
(59) Один?
   tesei
 
78 - 22.11.21 - 10:31
Было лет 10 назад. Переносил данные из чужой нетленки в УТ 10.3. Клиенты и Организации были в одном справочнике, я переносил все и в Контрагенты, и в Организации, для последующего разбора и чистки.
Какой-то документ в УТ 10.3 не проводился, зависал. Стал разбираться. Нашел получение в запросе учетной политики, обращение было в цикле ко всем существующим организациям. Бессмысленно и беспощадно. Запрос переписал.
   timurhv
 
79 - 22.11.21 - 10:34
Получать данные запросом в цикле = плохо, а загружать, допустим, большой справочник с +100500 строками кода из подсистемы БСП (версионирование, новая RLS) = нормально. Тьфу.
   Dmitrii
 
80 - 22.11.21 - 10:36
(69) >> А смысл? Это будут специфические случаи, которые человек со стороны без погружения в контекст не поймёт.

Какие-то уж совсем специфические случаи наверняка могут быть. Но не так уж они и часты, как может показаться.
Сами объекты (справочники, документы, регистры и пр.) у всех абсолютно одинаковые.
И, по-моему, случаев запросов в цикле, обусловленных спецификой именно самого бизнеса совсем единичные случаи.
   1Снеговик
 
81 - 22.11.21 - 10:37
(0) иногда без запроса в цикле не обойтись, особенно когда запрос - часть большой обработки данных в цикле. Иногда без цикла параметры запроса никак не получить.

Ну и все как правило упирается во время разработки. Можно сделать запрос в цикле, а потом, когда все заработает, подумать как оптимизировать.
   dubolom
 
82 - 22.11.21 - 11:02
(70) Да лан, всем ведь весело вроде.
   ГеннадийУО
 
83 - 22.11.21 - 11:02
(80) Именно, не так уж часты и обусловлены спецификой, которую объяснять без видимого профита ну совсем никакого интереса нет.
   ADirks
 
84 - 22.11.21 - 11:12
(68) ну и запросы у вас, батенька...
да если тут каждый начнет делать замеры и к ним объяснения - то кто трындеть то будет?!!
   Повелитель
 
85 - 22.11.21 - 11:14
(0) Когда база маленькая и товаров с ценами мало, то без разницы.
А вот у меня была такая практика. Разрабатывали мы командой конфигурацию для энергоснабжения города 105 000 абонентов. Ну и минимум раз в месяц нужно было сделать расчет. Так вот даже относительно быстрый запрос по замеру производительности например 0.1 секунда, в цикле на 105 000 = выдавал уже 1050 секунд или 17.5 минут. Естественно приходилось писать везде писать код оптимизированный.

Так и типовые конфигурации, кто-то использует на 100 позиций, а у нас в базе сейчас номенклатуры около 700 000 штук. Поэтому и говорят, что нельзя запрос в цикле в типовых. Да и в принципе если не знаешь, до каких масштабов твоё решение вырастет.
   Повелитель
 
86 - 22.11.21 - 11:16
(85) * ошибся я там 0.01 секунда, в цикле на 105 000 = выдавал уже 1050 секунд или 17.5 минут.
   VladZ
 
87 - 22.11.21 - 11:18
(0) На небольших объемах данных - ничем.
   Обработка
 
88 - 22.11.21 - 11:30
Как-то в начале 2000х писал конфу по ЗП на 1с77 в заводе.
Все с нуля. ЗиКа у нас не было.
Так вот какой-то у меня запрос и расчет длился 40 минут.
Я потом начали искать и оптимизировал что уже выполнялось в 2-3 минуты.
Как-то так.
Также не мало случаев было  и с запросами в цикле.
   МимохожийОднако
 
89 - 22.11.21 - 11:34
(76) "А если бы он вёз патроны?!"
   Dmitrii
 
90 - 22.11.21 - 11:34
(83) (84) Да понял я уже. Что никаких примеров не будет. А жаль. Было бы любопытно.
Всё с чем приходилось сталкиваться мне, это либо случаи когда разработчик посчитал нецелесообразным тратить время на усложнение кода ради копеечной выгоды в производительности. На небольших объёмах данных, значительный рост которых не ожидается в обозримом будущем, заметной разницы по скорости действительно может не быть. Либо массовые случаи одноразовых обработок, где производительность вообще никакого смысла не имеет, но важна скорость разработки и отладки.
   Ненавижу 1С
 
91 - 22.11.21 - 11:35
(70) а какое у тебя место на инфостарте?
   Жан Пердежон
 
92 - 22.11.21 - 11:37
(0) никак не угомонишься?
   Dmitrii
 
93 - 22.11.21 - 11:38
Понятно, что примеров оптимизации, полученной за счет переписывания множества запросов в цикле на один запрос, каждый может привести.
А хотелось бы посмотреть на обратные примеры. Когда запрос в цикле оказался более целесообразным. И по каким конкретно причинам.
   Гобсек
 
94 - 22.11.21 - 11:41
На маленькой БД с оптимизацией на быстродействие можно не заморачиваться.
   Гобсек
 
95 - 22.11.21 - 11:42
(94) + запрос в цикле - частая причина тормозов
   Гобсек
 
96 - 22.11.21 - 11:43
(94) + а к большой БД не факт, что ТС когда-нибудь подпустят
   Повелитель
 
97 - 22.11.21 - 11:44
(93) Да самый частый пример. Получить типовой функцией ПолучитьЦенуНоменклатуры() цены в цикле, а не думать надо запросом ))
   Said_We
 
98 - 22.11.21 - 11:45
(0) "но вот по каждому складу надо свой запрос формировать" - подскажите зачем?
   Kassern
 
99 - 22.11.21 - 11:49
(90) Вот вам пример из типовой УТ11. Здесь в цикле пытаются выполнить запрос, если не получилось то еще несколько раз пытаются)
    Пока Истина Цикл
        Попытка
            Результат = Запрос.Выполнить();// Чтение вне транзакции, возможно появление ошибки.

                                            // Could not continue scan with NOLOCK due to data movement

                                            // в этом случае нужно повторить попытку чтения.

            Прервать;
        Исключение
            КоличествоПопыток = КоличествоПопыток + 1;
            Если КоличествоПопыток = 5 Тогда
                ВызватьИсключение;
            КонецЕсли;
        КонецПопытки;
    КонецЦикла;
   dubolom
 
100 - 22.11.21 - 11:51
(93) Когда пишешь какую-нибудь разовую обработку, чаще всего важнее написать её побыстрее, а производительность - дело десятое. И часто бывает, что в цикле запрос пишется гораздо проще.
  1  2  3   

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