Имя: Пароль:
1C
 
Что быстрее будет Запрос или РасчитатьРегистрыНа... ?
0 smaharbA
 
17.09.10
13:28
Запрос и расчет простейшие:

Запрос такого плана -

ТекстЗапроса = "
   |Подр = Регистр.Склад.Подразделение;
   |Номенкл = Регистр.Склад.Номенклатура;
   |Парт = Регистр.Склад.Партия;
   |Характ = Регистр.Склад.Характеристика;
   |Колво = Регистр.Склад."+Ресурс+";
   |Условие(Подр В ФПодразделение);
   |Условие(Номенкл В ФНоменклатура);
   |Условие(Характ В ФХарактеристика);
   |Условие(Парт В ФПартия);
   |"+?(ПустоеЗначение(Позиция)=1,"
   |Функция Ост = КонОст(Колво)","
   |Период С (Позиция) По (Позиция);
   |Функция Ост = НачОст(Колво)")+";
   |";


Временный расчет подобный такому -

Если ПустоеЗначение(ОбъектРасчета)=1 Тогда
   Рег=Регистр.Склад;
Иначе
   Рег = СоздатьОбъект("Регистр.Склад");
   Рег.ВременныйРасчет(1);
   Для Сч=1 По Сп.РазмерСписка() Цикл
       Стр="";
       Зн=Сп.ПолучитьЗначение(Сч,Стр);
       Если ПустоеЗначение(Зн)=1 Тогда
           Зн=ПолучитьПустоеЗначение();
           Сп.УстановитьЗначение(Сч,Зн,Стр);
       КонецЕсли;
       Рег.УстановитьЗначениеФильтра(Стр,Зн,2);
   КонецЦикла;
   РассчитатьРегистрыНа(ОбъектРасчета);
КонецЕсли;

Возв=Рег.СводныйОстаток(Сп.Получить("Подразделение"),Сп.Получить("Номенклатура"),Сп.Получить("Партия"),Сп.Получить("Характеристика"),Ресурс);
1 Irbis
 
17.09.10
13:29
(0) А если замер производительности сделать?
2 zak555
 
17.09.10
13:29
какой-то странный временный расчёт
3 vS
 
17.09.10
13:29
эксперимент в отладчике? ;)
4 smaharbA
 
17.09.10
13:30
(1)(3) эээ, а нафига тогда вы тут, премьеру советы давать ? )))
5 Джинн
 
модератор
17.09.10
13:37
Запрос медленнее примерно в 5 раз.
6 Ёпрст
 
гуру
17.09.10
13:38
(0) зачем тебе начост и коност, если ты на позицию смотришь?
7 smaharbA
 
17.09.10
14:07
(6) а ты глянь внимательнее, они порознь от обстоятельств

(5) проверено ? Если так, то ужаснах :(
8 smaharbA
 
17.09.10
14:09
или достаточно обойтись просто Количество ? (не шарю с запросами)
9 smaharbA
 
17.09.10
14:11
да - база скульная

а прямой запрос будет быстрее ли ?
10 МастерВопросов
 
17.09.10
14:12
(5) если стоит клиент-серверный вариант и на сервере не слабое железо, то не факт, что запрос медленее.
11 Ёпрст
 
гуру
17.09.10
14:13
(9) будет быстрее.
12 smaharbA
 
17.09.10
14:14
(11) спасибо, буду всовывать оставляя прежний временный расчет при невозможности выполнения запроса

а вот интересуюсь почему прямой запрос будет быстрее ?
13 smaharbA
 
17.09.10
14:15
+ или этого не нужно понимать, в это просто надо верить ? )))
14 Ёпрст
 
гуру
17.09.10
14:16
(13) а ты профайлером погляди, что летит на сервер - там усё виддно :)
15 smaharbA
 
17.09.10
14:17
да еще вопрос по "в пять раз медленнее" - а не че, что временный расчет в "цикле" (как в прочем и запрос) ?
16 smaharbA
 
17.09.10
14:18
сабж рассматривается не в одиночном выполнении, а в "групповом" - т.е. из многострочной части или еще из каких использоватьсписок
17 МихаилМ
 
17.09.10
14:20
все зависит от формата хранения данных.

для скл будет быстрее расчитать регистры на границу хранения (те считать готовые расчитанные можно даже бех фильтра, если больше 200 позиций ) и
запросом выбрать обороты . сответственно их прибвить или отнять.

1с зачем то в запросе дважды расчитывает итоги на начало и дважды на конец
что есть тормознуто.
18 smaharbA
 
17.09.10
14:22
(17) т.е. будет быстрее снять остаток и вычисть сумму по движениям ?
19 dk
 
17.09.10
14:23
еще шустрее будет
РегОбщ = СоздатьОбъект("Регистры");
Рег = РегОбщ.Склад;
...
Рег.ВременныйРасчет(1);
РегОбщ.РассчитатьРегистрыНа(...)
----
по крайней мере в теории
20 smaharbA
 
17.09.10
14:24
(19) в практике объект Регистры оказался медленнее
21 dk
 
17.09.10
14:24
странно
22 smaharbA
 
17.09.10
14:24
(21) вот и я так же сказал
23 dk
 
17.09.10
14:25
про фишку тормозов в скуле при фильтре на список значений с более 50 элементов в курсе?
24 Fragster
 
гуру
17.09.10
14:27
прямой запрос будет быстрее
25 smaharbA
 
17.09.10
14:33
(23) нет, может и было, но не вспомню
поясни
26 Fragster
 
гуру
17.09.10
14:37
(25) В замени на ФПодразделение.Найти(..) = 1
27 МихаилМ
 
17.09.10
14:40
(25)
1с77 скл для передачи каждого значения зоздает хранимую процедуру, исполняет ее,
затем удаляет.

это не быстро.

соответсвенно в запросе эффективней передовать список фильтрации
через массив в виде  Условие (искзначение = Массив[1] ... искзначение = Массив[N])

правда у этого метода есть ограничение на рамер текста запроса в
40 килобайт.

те макс размер массива не  2200 элементов.
28 dk
 
17.09.10
14:55
(25) если наложить в скульной базе условие фильтром
Условие МоеПоле В МойСЗ;
и в МойСЗ будет список значений с более чем 50(условно) элементов, то скуль сильно призадумается, т.к. 1С по тупому этот список во временную таблицу засовывает
---
куда быстрее сработает
Условие МойСЗ.Принадлежит(МоеПоле) = 1;
правда это условие уже на клиенте будет отрабатывать, но шустрее в разы просто
29 smaharbA
 
17.09.10
15:00
(27)(28) понял, но в (0) нету списков там тупо значения, а то что "В", что бы безо всяких ухищрений не срабатывало условие на пустые значения
30 МихаилМ
 
17.09.10
15:08
(28)
принадлежит() вообще в скл версии лучше не использовать
тк проверка делается чере скл запрос.

тк базы 1с77 скл нет под рукой проверить не могу.

Условие МойСЗ.Принадлежит(МоеПоле) = 1
должно быть очень тормозным в отличии от  НайтиЗначение()
31 Эльниньо
 
17.09.10
18:14
(19) А что лучше?
РегОбщ = СоздатьОбъект("Регистры");
Рег = РегОбщ.Склад;
или
Рег = СоздатьОбъект("Регистр.Склад");
32 Мимохожий Однако
 
17.09.10
20:22
(31)Одинаково.
33 ДенисЧ
 
17.09.10
20:33
а я бы вообще через прямой делал бы...
34 dk
 
20.09.10
07:53
(30) "Значение В Список" = "Список.Принадлежит(Значение)" <> "Список.НайтиЗначение(Значение) <> 0"
35 smaharbA
 
20.09.10
07:55
(32) есть различие, в первом случае один и тот же регистр может принять участие сразу в нескольких временных расчетах
36 smaharbA
 
20.09.10
07:56
(33) это само собою
2 + 2 = 3.9999999999999999999999999999999...