Имя: Пароль:
1C
1С v8
Запрос оптимизация
,
0 gp42
 
26.09.11
11:06
в цикле выполняется для каждого ЛИЦЕВОЙСЧЕТ из списка
Как оптимизировать ... время выполнения надо ускорить

      Запрос.Текст = "ВЫБРАТЬ
                     |    МАКСИМУМ(ВзаиморасчетыПоЛицевымСчетамОрганизаций.Период) КАК Период
                     |ПОМЕСТИТЬ втПериод
                     |ИЗ
                     |    РегистрНакопления.ВзаиморасчетыПоЛицевымСчетамОрганизаций КАК ВзаиморасчетыПоЛицевымСчетамОрганизаций
                     |ГДЕ
                     |    ВзаиморасчетыПоЛицевымСчетамОрганизаций.ЛицевойСчет = &ЛицевойСчет
                     |    И ВзаиморасчетыПоЛицевымСчетамОрганизаций.Период <= &ТекДата
                     |    И ВзаиморасчетыПоЛицевымСчетамОрганизаций.ВидОплат В (ЗНАЧЕНИЕ(справочник.видоплат.контрольноепоказание), ЗНАЧЕНИЕ(справочник.видоплат.Допредъявлено), ЗНАЧЕНИЕ(справочник.видоплат.ОтключениеСчетчика), ЗНАЧЕНИЕ(справочник.видоплат.ПоказаниеСКвитанции), ЗНАЧЕНИЕ(справочник.видоплат.СоСловАбонента), ЗНАЧЕНИЕ(справочник.видоплат.КонтрольноеПоказаниеСетевойКомпании), ЗНАЧЕНИЕ(справочник.видоплат.УстановкаСчетчика), ЗНАЧЕНИЕ(справочник.видоплат.КОНТРОЛЬНЫЙУРОВЕНЬ))
                     |    И ВзаиморасчетыПоЛицевымСчетамОрганизаций.РазделПоДГПХ = ЗНАЧЕНИЕ(справочник.РазделыДоговоровГПХ.электроэнергия)
                     |;
                     |
                     |////////////////////////////////////////////////////////////////////////////////
                     |ВЫБРАТЬ ПЕРВЫЕ 3
                     |    Нач.Период КАК Период,
                     |    Нач.Регистратор,
                     |    Нач.ВидОплат,
                     |    ЗНАЧЕНИЕ(справочник.категориипоказаний.пустаяссылка) КАК КатегорияПоказаний,
                     |    Нач.Ответственный,
                     |    Нач.КонечноеПоказание КАК Значение,
                     |    ВЫБОР
                     |        КОГДА Нач.НомерДискаКонечный = 0
                     |            ТОГДА 1
                     |        ИНАЧЕ Нач.НомерДискаКонечный
                     |    КОНЕЦ КАК НомерДиска
                     |ИЗ
                     |    втПериод КАК втПериод
                     |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыПоЛицевымСчетамОрганизаций КАК Нач
                     |        ПО втПериод.Период = Нач.Период
                     |ГДЕ
                     |    Нач.ЛицевойСчет = &ЛицевойСчет
                     |    И Нач.Период <= &ТекДата
                     |    И Нач.ВидОплат В (ЗНАЧЕНИЕ(справочник.видоплат.контрольноепоказание), ЗНАЧЕНИЕ(справочник.видоплат.Допредъявлено), ЗНАЧЕНИЕ(справочник.видоплат.ОтключениеСчетчика), ЗНАЧЕНИЕ(справочник.видоплат.ПоказаниеСКвитанции), ЗНАЧЕНИЕ(справочник.видоплат.СоСловАбонента), ЗНАЧЕНИЕ(справочник.видоплат.КонтрольноеПоказаниеСетевойКомпании), ЗНАЧЕНИЕ(справочник.видоплат.УстановкаСчетчика), ЗНАЧЕНИЕ(справочник.видоплат.КОНТРОЛЬНЫЙУРОВЕНЬ))
                     |    И Нач.РазделПоДГПХ = ЗНАЧЕНИЕ(справочник.РазделыДоговоровГПХ.электроэнергия)
                     |
                     |УПОРЯДОЧИТЬ ПО
                     |    Период УБЫВ";
1 mikecool
 
26.09.11
11:06
убрать запрос из цикла
2 Jstunner
 
26.09.11
11:07
сделай не в цикле
3 CyberDream
 
26.09.11
11:07
никогда, НИКОГДА, не включать запросы в циклы
4 Maxus43
 
26.09.11
11:07
убрать - ВЫБРАТЬ ПЕРВЫЕ 3
В (&ЛицевойСчет)

потом уже НайтиСтроки по лицевому счету и в цикле первые 3 просматривай по нему...
5 Ненавижу 1С
 
гуру
26.09.11
11:07
про то что цикла не должно быть, говорили?
6 Maxus43
 
26.09.11
11:08
(3) разрабам УПП тоже можеш сказать. Они почему то не в курсе)
7 zak555
 
26.09.11
11:09
лицСчет левое соединение + использовать параметры виртуальной таблицы
8 CyberDream
 
26.09.11
11:11
(6) разрабы какого-то фига не делают стресс тесты системе. Поэтому им пофик.
9 Axel2009
 
26.09.11
11:13
(8) стресс тест не нужен, чтобы понять что в цикле запросов не желательно делать для частых операций, тем более от которых зависят транзакции.
значит разраб который занимался этим куском не разраб, а пришел по объявлению..
10 Maxus43
 
26.09.11
11:14
(8) нафига им, у них тестировщиков целая страна
11 Fragster
 
гуру
26.09.11
11:14
(3) у меня запрос по поиску сочетаний комплектов в цикле - теперь я умру? (ищем максимальный по приоритету комплект, исключаем его номенклатуру из списка, затем по остатку номенклатуры ищем следующий).

кстати, если предложите более оптимальный вариант - буду рад
12 Jstunner
 
26.09.11
11:15
(11) покажи запрос-то
13 Maxus43
 
26.09.11
11:16
да есть на практике ситуации когда запрос в цикле спасает только, но в типовых они встречаются без необходимости делать это в цикле
14 Axel2009
 
26.09.11
11:17
(11) выбрать сразу все возможные номенклатуры, которые могут участвовать в каком-то комплекте. по ним получить остатки и в цикле уже подбирать нужное..
15 Reset
 
26.09.11
11:18
ТС хорошо вбросил с утра в понедельник
16 Maxus43
 
26.09.11
11:21
аж перевозбудились все
17 Fragster
 
гуру
26.09.11
11:25
(12)(14) офигейте:
http://pastebin.com/AkPNLYwV
18 Axel2009
 
26.09.11
11:35
(17) да там фигеть то нечего. нарастающий итог без цикла никак не делается. и тут выбор либо циклом запросы к серверу. там я вижу еще и перегоны из одной временной таблицы в другую. веселое занятие =)
либо получаешь все остатки и цикл организуешь на сервере 1с без доп обращений к серверу. переписывать есно надо всю процедуру.
19 Fragster
 
гуру
26.09.11
11:39
(18) перегоны из одной ВТ в другую - из-за того, что нельзя добавить данные в ВТ к уже имеющимся - получается, нужно перелить ВТ + новые данные в новую ВТ, прибить старую ВТ, перелить из старой в новую, прибить новую. пирбивания нужны, чтобы в цикле выполнялось, да
20 Киборг
 
26.09.11
11:44
(0)
а) зачем делать врем таблицу, когда она по сути не используетя?
б) почему виртуальная таблица соединяется с физической, когда такое делать нельзя?
21 Axel2009
 
26.09.11
11:47
(19) да я знаю зачем нужны перегоны =) не надо объяснять. я тебе говорю что можно это запросами делать а циклом на сервере 1с. ну а дальше вопрос в наличии времени под это. ;)
22 Axel2009
 
26.09.11
11:48
(20) как это не используется?
втПериод КАК втПериод
                     |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыПоЛицевымСчетамОрганизаций КАК Нач
                     |        ПО втПериод.Период = Нач.Период
23 Киборг
 
26.09.11
11:53
(22)
а можно несколько раз поместить полученный результат во врем таблицу?

примерно так

ВЫБРАТЬ
*
ПОМЕСТИТЬ втПериод
...

;

ВЫБРАТЬ
*
ПОМЕСТИТЬ втПериод1
ИЗ втПериод
...

;

...
втПериод1 КАК втПериод1
                     |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыПоЛицевымСчетамОрганизаций КАК Нач
                     |        ПО втПериод1.Период = Нач.Период
24 Fragster
 
гуру
26.09.11
11:55
(21) циклом пробовал - получается еще более адский говнокод. задача - есть справочник комплекты, у него в ТЧ колонки ГруппаКомплекта (повторяется), Номенклатура(разная), Количество (этой номенклатуры).
есть специальные строки Группа заполнена, а номенклатура - нет. в количество пишется сколько строк с этой группы должно быть выбрано (строки могут повторятся).

Например,
группа 1 / пусто / 2
группа 1 / номенклатура 1 / 1
группа 1 / номенклатура 2 / 1
группа 2 / номенклатура 3 / 1
группа 2 / номенклатура 4 / 1

комплектом будет, например (номенклатура / количество)
номенклатура 1 / 1
номенклатура 2 / 1
номенклатура 3 / 1

или
номенклатура 1 / 2
номенклатура 4 / 1

комплектов реально много, с пересекающимися номенклатурами.
25 Fragster
 
гуру
26.09.11
11:56
(24)+ ну и у комплектов есть приоритет, который определяет, который комплект должен собраться, если несколько вариантов
26 Axel2009
 
26.09.11
11:59
(25) да понятна задача уже давно.. делал такую как раз через цикл на сервере 1с. а не через запрос.. то что возможно ховнокод - согласен.. потому как переменные нужно гдето хранить. вопрос в быстродействии или ховнокода?
27 Fragster
 
гуру
26.09.11
12:04
(26) в быстродействии больше - ибо один из критических моментов. мой вариант выполняется где-то 0.1-0.15 секунды, что, в принципе, нормально.
28 Fragster
 
гуру
26.09.11
12:05
а кодом 1с - слишком много всяких "НайтиСтроку", которые убивают быстродействие... все-таки это соединениями в запросах проще делается...
29 Fragster
 
гуру
26.09.11
12:12
(26) твой вариант какой?
30 Axel2009
 
26.09.11
12:29
(27) циклов сколько?
31 Axel2009
 
26.09.11
12:30
(30)+ вообще тебя спасает, что нет обращений к остаткам. поэтому можно не менять и не оптимизировать. нарастающий итог он такой. а мне нужно было к реальным остаткам обращаться.. тут то и была бы проблемка
32 Fragster
 
гуру
26.09.11
12:36
(30) в среднем - 2-3 итерации получается, засеченный максимум - 7
33 Axel2009
 
26.09.11
12:58
(32) ну теоретически если напишешь свой код средствами 1с и отладишь его, и потом соединишь это все в 1 строку чтобы Цикл и КонецЦикла считалось одной строкой, то все будет махом считаться =))) только этот ховнокод отлаживать будет нереально =)
34 Jstunner
 
26.09.11
13:08
(27) 0.1-0.15 секунды - это, конечно, значительная задержка, ради которой стоит тратить кучу времени на оптимизацию
35 Fragster
 
гуру
26.09.11
13:13
(34) дело не в оптимизации времени, а в оптимизации "говнокодести", чтобы было понятнее и дальнейшие доработки были проще.
36 Jstunner
 
26.09.11
13:20
(35) по мне, так постановка задачи в (24) сама по себе, выражаясь твоим языком, "овнокодная"