|
Запрос оптимизация | ☑ | ||
---|---|---|---|---|
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) сама по себе, выражаясь твоим языком, "овнокодная"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |