Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Вт Апр 10, 2018 18:16   |
|
Полезность: Нет оценки
|
Цитата: | Я считал что объект имею - к его свойствам быстро доступ происходит. |
Один вызов быстро - а тысячи?
Цитата: | По многим клиентам действительно долго. |
Так списочная операция? |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Вт Апр 10, 2018 18:24   |
|
Полезность: Нет оценки
|
Цитата: | Так списочная операция? |
Либо один клиент, либо все ЮЛ или ФЛ? |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Вт Апр 10, 2018 18:29   |
|
Полезность: Нет оценки
|
Опять же кучу всего вычисляете, что касается клиента, до оборотов, но вывод в Excel зависит от оборота. Зря получается, да еще и на каждый счет? |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Ср Апр 11, 2018 06:02   |
|
Полезность: Нет оценки
|
mmm_kazan пишет: | Я понимаю, что индескс наверное не тот.
Очень много конструкций OR.
Выслал все, что есть. |
Ну хотя бы место вычислили где больше всего времени тратится ?
тупо по коду debug_pipe расставить ,
а том может там много строк выводится и тормозит на выводе
EXCEL.Write
а не на запросах и не из-за большого числа циклов.... |
|
 |
mmm_kazan Участник со стажем
Вступление в Клуб: 28.03.2018
|
Ср Апр 11, 2018 08:43   |
|
Полезность: Нет оценки
|
Здравствуйте.
Согласен, что тормоза получаются при выводе оборотов.
Вот и хочу расставить метки, чтобы понять на каком селекте
Извините - в программировании в ЦФТ опыт действительно небольшой.
А по поводу оборотов обошел галочками разными на форме.
Если кому не нужно - не указывают. |
|
 |
mmm_kazan Участник со стажем
Вступление в Клуб: 28.03.2018
|
Ср Апр 11, 2018 08:49   |
|
Полезность: Нет оценки
|
Alkov пишет: | mmm_kazan пишет: | Я понимаю, что индескс наверное не тот.
Очень много конструкций OR.
Выслал все, что есть. |
Ну хотя бы место вычислили где больше всего времени тратится ?
тупо по коду debug_pipe расставить ,
а том может там много строк выводится и тормозит на выводе
EXCEL.Write
а не на запросах и не из-за большого числа циклов.... |
А строк там не так много.
Научите как правильно узкие места искать? |
|
 |
mmm_kazan Участник со стажем
Вступление в Клуб: 28.03.2018
|
Ср Апр 11, 2018 08:52   |
|
Полезность: Нет оценки
|
Бывают конечно ситуации, когда порядка 200 клиентов выходят. Вот тогда и начинаются проблемы. |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Ср Апр 11, 2018 09:39   |
|
Полезность: Нет оценки
|
Опять же код трудночитаемый.
Параметры операции (закладка Параметры) должны начинаться с P_, а переменные (закладка Переменные) с V_. Соответственно у локальных переменных д.б. другие префиксы. |
|
 |
mmm_kazan Участник со стажем
Вступление в Клуб: 28.03.2018
|
Ср Апр 11, 2018 10:09   |
|
Полезность: Нет оценки
|
В общем осовная беда код 6 сек. выполняется по одному клиенту.
for
(select l1(l1 : l1_id)
in ::[LEGAL_161P]
where l1.vo=1984365)
loop
if ::[LEGAL_161P].[Z134021099].get_payer_inn(l1.l1_id)=c.[c_inn] or ::[LEGAL_161P].[Z134021099].get_recip_inn(l1.l1_id)=c.[c_inn] then
c_Number_Doc_Ostanov_str := '6001. Код подозрительных операций.';
exit;
end if;
end loop; |
|
 |
mmm_kazan Участник со стажем
Вступление в Клуб: 28.03.2018
|
Ср Апр 11, 2018 10:12   |
|
Полезность: Нет оценки
|
И вот этот код по 2 сек каждый
Выбираются в общем наиболее крупные проводки с контрагентами
debug_pipe('11Время - '||(utils.get_time),0);
for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_DT].[0]=1 then md1.[KL_DT].[1].[1].[NAME]
else md1.[KL_DT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all
where md1.[ACC_KT]=c.[af_id]
and (md1.[DATE_PROV]>=DATE_BEGIN)
and (md1.[DATE_PROV]<=DATE_END)
and md1%state='PROV'
order by 1 desc)
loop
if i >= 10 then
exit;
end if;
real_doc_cred:=real_doc_cred||md1.contragent||' '||to_char(md1.m_sum,'999999999999999.99')||' '||md1.m_nazn||chr(10);
i := i + 1;
end loop;
i := 1;
debug_pipe('12Время - '||(utils.get_time),0);
for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_KT].[0]=1 then md1.[KL_KT].[1].[1].[NAME]
else md1.[KL_KT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all
where md1.[ACC_DT]=c.[af_id]
and (md1.[DATE_PROV]>=DATE_BEGIN)
and (md1.[DATE_PROV]<=DATE_END)
and md1%state='PROV'
order by 1 desc)
loop
if i >= 10 then
exit;
end if;
real_doc_deb:=real_doc_deb||md1.contragent||' '||to_char(md1.m_sum,'999999999999999.99')||' '||md1.m_nazn||chr(10);
i := i + 1;
end loop; |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Ср Апр 11, 2018 10:32   |
|
Полезность: Нет оценки
|
mmm_kazan пишет: | В общем осовная беда код 6 сек. выполняется по одному клиенту.
for
(select l1(l1 : l1_id)
in ::[LEGAL_161P]
where l1.vo=1984365)
loop
if ::[LEGAL_161P].[Z134021099].get_payer_inn(l1.l1_id)=c.[c_inn] or ::[LEGAL_161P].[Z134021099].get_recip_inn(l1.l1_id)=c.[c_inn] then
c_Number_Doc_Ostanov_str := '6001. Код подозрительных операций.';
exit;
end if;
end loop; |
Возможно быстрее будет так:
[code]
begin
select l(l)
in ::[LEGAL_161P], (::[MAIN_DOCUM] all :md) all
where
l.[DOC]= md%id
and (md.[ACC_DT].[CLIENT_V] = CLIENT%id
or md.[ACC_KT].[CLIENT_V] = СLIENT%id)
and l.[VO] = ::[VID_OPER_PRED]([code]='6001')
and l.[DATE_P] >= P_DATE_BEG -- наверное можно ограничить по дате ?
and l.[DATE_P] <= P_DATE_END -- наверное можно ограничить по дате ?
and md%state = 'PROV'
and l.[STATUS] in (наверное не все нужны)
and rownum=1
into tmp_num;
c_Number_Doc_Ostanov_str := '6001. Код подозрительных операций.';
exception when NO_DATA_FOUND then
tmp_num := 0;
end ;
[/code] |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Ср Апр 11, 2018 15:49   |
|
Полезность: Нет оценки
|
Код: | for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_DT].[0]=1 then md1.[KL_DT].[1].[1].[NAME]
else md1.[KL_DT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all |
используйте [RECORDS] |
|
 |
mmm_kazan Участник со стажем
Вступление в Клуб: 28.03.2018
|
Ср Апр 11, 2018 15:58   |
|
Полезность: Нет оценки
|
Volod пишет: | Код: | for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_DT].[0]=1 then md1.[KL_DT].[1].[1].[NAME]
else md1.[KL_DT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all |
используйте [RECORDS] |
Здравствуйте.
Пример бы предоставили? ) |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Ср Апр 11, 2018 16:45   |
|
Полезность: Нет оценки
|
см. например операцию FTS_ACC_MOVE
type Q_DOC is |
|
 |
mmm_kazan Участник со стажем
Вступление в Клуб: 28.03.2018
|
Чт Апр 12, 2018 08:45   |
|
Полезность: Нет оценки
|
Volod пишет: | см. например операцию FTS_ACC_MOVE
type Q_DOC is |
Здравствуйте.
Я посмотрел пример - можно пояснить?
Я так понимаю, что
pragma macro(acc, 'f.a(''В''||to_char(arc_move)||''[1]В'', [2], P_DATE2)', substitute);
Посчитает обороты.
Потом я arc_move использую как таблицу.
Честно сказать таким механизмом не пользовался. |
|
 |
|