powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизпция sql кода
25 сообщений из 30, страница 1 из 2
Оптимизпция sql кода
    #39698280
Erik1210198686
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно оптимизировать этот код. Оно выполняеться 180 минут надо сократит время.
select

decode(d.is_authorization, 'Y'/*AUTH*/, d.trans_date, d.trans_date) as TRANS_DATE,
substr(trim(ac.contract_number), 1, 4) || '********' ||
substr(trim(ac.contract_number), 13, 4) as N_êàðòî÷êè,
cu.name as Âàëþòà_êîíò,
p.s,
cu2.name as Âàëþòà_òðàíç,
d.trans_amount as ñóììà_òðàíç,
rc.resp_text,
co.name as Ñòðàíà,
d.trans_city as Ãîðîä,
d.trans_details ,
s.name as SICCODE,
cl.short_name,
ac.service_group as Êîä_ôèëèàëà,
ct.name as Òèï_êëèåíòà,
cl.client_number as ÈÈÍ,
tt.name as Òèï_òðàíçàêöèè,
round(d.trans_amount / 1000, 2) t_am,
round((case d.settl_curr
when '398' then
d.settl_amount / fxr.cb_rate
when '978' then
d.settl_amount * fxeur.cb_rate / fxr.cb_rate
else
d.settl_amount
end),
2) Am_USD,
round(sum(case d.settl_curr
when '398' then
d.settl_amount / fxr.cb_rate
when '978' then
d.settl_amount * fxeur.cb_rate / fxr.cb_rate
else
d.settl_amount
end) over(partition by ac.client__id),
2) sum_USD
from ows.acnt_contract ac
join ows.client cl on ac.client__id = cl.id
and cl.amnd_state = 'A'
and cl.clt in
join ows.doc d on ac.contract_number = d.target_number
and d.source_channel in ('v', 'V', 'O')
and d.amnd_state = 'A'
and d.trans_date >= to_date('29.06.2018', 'dd.mm.yyyy')
and d.trans_date <= to_date('03.08.2018', 'dd.mm.yyyy')-- + 1
and d.posting_status = 'P'
and d.fx_settl_date > to_date('1990-01-01', 'yyyy-mm-dd')
and d.id > 0
and d.trans_type in (5, 11, 13, 50)
join ows.acnt_contract acc on ac.acnt_contract__oid = acc.id
and acc.amnd_state = 'A'
join ows.currency cu on cu.code = ac.curr
and cu.amnd_state = 'A'
join ows.currency cu2 on cu2.code = d.trans_curr
and cu2.amnd_state = 'A'
join ows.sic s on s.code = d.sic_code
and s.amnd_state = 'A'
join ows.resp_code rc on d.return_code = rc.resp_code
and rc.amnd_state = 'A'
join ows.country co on co.code = d.trans_country
and co.name <> 'Kazakhstan'
and co.amnd_state = 'A'
left join ows.CREDIT_HISTORY ch on ch.doc__id = d.id
join ows.client_type ct on ct.id = cl.clt
and ct.amnd_state = 'A'
and ct.id in (6, 10)
left join ows.trans_type tt on d.trans_type = tt.id
and tt.amnd_state = 'A'
join ows.m_transaction mt on d.id = mt.doc__oid
and mt.posting_status = 'P'
and mt.id > 0
and mt.service_class = 'T'
left join ows.fx_rate fxr on mt.fx_seqv_n = fxr.seqv_n
and fxr.code = 840
left join ows.fx_rate fxeur on mt.fx_seqv_n = fxeur.seqv_n
and fxeur.code = 978
left join (select abs(den.AMOUNT) s,
d1.doc__prev__id d,
den.ACNT_CONTRACT__ID num
from ows.doc_entry_n den
join ows.doc d1 on den.DOC__OID = d1.id
and d1.amnd_state = 'A') p on p.num = ac.id
and p.d = d.id
where ac.amnd_state = 'A'
and ac.con_cat = 'C'
and (ac.service_group = '*' or '*' = '*')
order by 1
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698287
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
select 
 decode(d.is_authorization, 'Y'/*AUTH*/, d.trans_date, d.trans_date) as TRANS_DATE,
...



Код: plsql
1.
2.
3.
select 
 d.trans_date,
...
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698318
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отформатировал чтобы смотреть
Erik1210198686Как можно оптимизировать этот код. Оно выполняеться 180 минут надо сократит время.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
select 

decode(d.is_authorization, 'Y'/*AUTH*/, d.trans_date, d.trans_date) as TRANS_DATE,
       substr(trim(ac.contract_number), 1, 4) || '********' ||
       substr(trim(ac.contract_number), 13, 4) as N_&#234;&#224;&#240;&#242;&#238;&#247;&#234;&#232;,
       cu.name as &#194;&#224;&#235;&#254;&#242;&#224;_&#234;&#238;&#237;&#242;,
       p.s,
       cu2.name as &#194;&#224;&#235;&#254;&#242;&#224;_&#242;&#240;&#224;&#237;&#231;,
       d.trans_amount as &#241;&#243;&#236;&#236;&#224;_&#242;&#240;&#224;&#237;&#231;,
       rc.resp_text,
       co.name as &#209;&#242;&#240;&#224;&#237;&#224;,
       d.trans_city as &#195;&#238;&#240;&#238;&#228;,
       d.trans_details ,
       s.name as SICCODE,
       cl.short_name,
       ac.service_group as &#202;&#238;&#228;_&#244;&#232;&#235;&#232;&#224;&#235;&#224;,
       ct.name as &#210;&#232;&#239;_&#234;&#235;&#232;&#229;&#237;&#242;&#224;,
       cl.client_number as &#200;&#200;&#205;,
       tt.name as &#210;&#232;&#239;_&#242;&#240;&#224;&#237;&#231;&#224;&#234;&#246;&#232;&#232;,
       round(d.trans_amount / 1000, 2) t_am,
       round((case d.settl_curr
               when '398' then
                d.settl_amount / fxr.cb_rate
               when '978' then
                d.settl_amount * fxeur.cb_rate / fxr.cb_rate
               else
                d.settl_amount
             end),
             2) Am_USD,
       round(sum(case d.settl_curr
                   when '398' then
                    d.settl_amount / fxr.cb_rate
                   when '978' then
                    d.settl_amount * fxeur.cb_rate / fxr.cb_rate
                   else
                    d.settl_amount
                 end) over(partition by ac.client__id),
             2) sum_USD
  from ows.acnt_contract ac
  join ows.client cl on ac.client__id = cl.id
                    and cl.amnd_state = 'A'
                    and cl.clt in 
  join ows.doc d on ac.contract_number = d.target_number
                and d.source_channel in ('v', 'V', 'O')
                and d.amnd_state = 'A'
                and d.trans_date >= to_date('29.06.2018', 'dd.mm.yyyy')
                and d.trans_date <= to_date('03.08.2018', 'dd.mm.yyyy')-- + 1
                and d.posting_status = 'P'
                and d.fx_settl_date > to_date('1990-01-01', 'yyyy-mm-dd')
                and d.id > 0
                and d.trans_type in (5, 11, 13, 50)
  join ows.acnt_contract acc on ac.acnt_contract__oid = acc.id
                            and acc.amnd_state = 'A'
  join ows.currency cu on cu.code = ac.curr
                      and cu.amnd_state = 'A'
  join ows.currency cu2 on cu2.code = d.trans_curr
                       and cu2.amnd_state = 'A'
  join ows.sic s on s.code = d.sic_code
                and s.amnd_state = 'A'
  join ows.resp_code rc on d.return_code = rc.resp_code
                       and rc.amnd_state = 'A'
  join ows.country co on co.code = d.trans_country
                     and co.name <> 'Kazakhstan'
                     and co.amnd_state = 'A'
  left join ows.CREDIT_HISTORY ch on ch.doc__id = d.id
  join ows.client_type ct on ct.id = cl.clt
                         and ct.amnd_state = 'A'
                         and ct.id in (6, 10)
  left join ows.trans_type tt on d.trans_type = tt.id
                             and tt.amnd_state = 'A'
  join ows.m_transaction mt on d.id = mt.doc__oid
                           and mt.posting_status = 'P'
                           and mt.id > 0
                           and mt.service_class = 'T'
  left join ows.fx_rate fxr on mt.fx_seqv_n = fxr.seqv_n
                           and fxr.code = 840
  left join ows.fx_rate fxeur on mt.fx_seqv_n = fxeur.seqv_n
                             and fxeur.code = 978
  left join (select abs(den.AMOUNT) s,
                    d1.doc__prev__id d,
                    den.ACNT_CONTRACT__ID num
               from ows.doc_entry_n den
               join ows.doc d1 on den.DOC__OID = d1.id
                              and d1.amnd_state = 'A') p on p.num = ac.id
                                                        and p.d = d.id
 where ac.amnd_state = 'A'
   and ac.con_cat = 'C'
   and (ac.service_group = '*' or '*' = '*')
 order by 1
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698322
Erik1210198686
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,
Что за фильтрация
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698324
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686,

объемы таблиц и схемы их индексации предлагается угадать? может у вас там миллиарды неиндексированных данных. тогда 180 минут - не такой уж и плохой результат...
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698338
Erik1210198686
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,

В базе 100000 записей . Начальник говорит это долго. Можно объединить ли таблицы без join.
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698341
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686Можно объединить ли таблицы без join.Можно. Но будет больше и медленней.
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698349
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686Vadim Lejnin,
Что за фильтрация

Используйте тэги форума, читать невозможно запросы без них
+ у Вас кодировка национальных символов поплыла

У В целом, запрос как запрос
За исключением шедевров вроде:
Код: plsql
1.
 and (ac.service_group = '*' or '*' = '*')



Запрос на засыпку: что вернет это выражение? :)
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698350
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686,

Тут у Вас - беда печаль

Да еще и странный select

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
select 

decode(d.is_authorization, 'Y'/*AUTH*/, d.trans_date, d.trans_date) as TRANS_DATE,
substr(trim(ac.contract_number), 1, 4) || '********' ||
substr(trim(ac.contract_number), 13, 4) as N_&#234;&#224;&#240;&#242;&#238;&#247;&#234;&#232;,
cu.name as &#194;&#224;&#235;&#254;&#242;&#224;_&#234;&#238;&#237;&#242;,
p.s,
cu2.name as &#194;&#224;&#235;&#254;&#242;&#224;_&#242;&#240;&#224;&#237;&#231;,
d.trans_amount as &#241;&#243;&#236;&#236;&#224;_&#242;&#240;&#224;&#237;&#231;,
rc.resp_text,
co.name as &#209;&#242;&#240;&#224;&#237;&#224;,
d.trans_city as &#195;&#238;&#240;&#238;&#228;,
d.trans_details ,
s.name as SICCODE,
cl.short_name,
ac.service_group as &#202;&#238;&#228;_&#244;&#232;&#235;&#232;&#224;&#235;&#224;,
ct.name as &#210;&#232;&#239;_&#234;&#235;&#232;&#229;&#237;&#242;&#224;,
cl.client_number as &#200;&#200;&#205;,
tt.name as &#210;&#232;&#239;_&#242;&#240;&#224;&#237;&#231;&#224;&#234;&#246;&#232;&#232;,
round(d.trans_amount / 1000, 2) t_am,
round((case d.settl_curr
when '398' then
d.settl_amount / fxr.cb_rate
when '978' then
d.settl_amount * fxeur.cb_rate / fxr.cb_rate
else
d.settl_amount
end),
2) Am_USD,
round(sum(case d.settl_curr
when '398' then
d.settl_amount / fxr.cb_rate
when '978' then
d.settl_amount * fxeur.cb_rate / fxr.cb_rate
else
d.settl_amount
end) over(partition by ac.client__id),
2) sum_USD
from ows.acnt_contract ac
join ows.client cl on ac.client__id = cl.id
and cl.amnd_state = 'A'
and cl.clt in 
join ows.doc d on ac.contract_number = d.target_number
and d.source_channel in ('v', 'V', 'O')
and d.amnd_state = 'A'
and d.trans_date >= to_date('29.06.2018', 'dd.mm.yyyy')
and d.trans_date <= to_date('03.08.2018', 'dd.mm.yyyy')-- + 1
and d.posting_status = 'P'
and d.fx_settl_date > to_date('1990-01-01', 'yyyy-mm-dd')
and d.id > 0
and d.trans_type in (5, 11, 13, 50)
join ows.acnt_contract acc on ac.acnt_contract__oid = acc.id
and acc.amnd_state = 'A'
join ows.currency cu on cu.code = ac.curr
and cu.amnd_state = 'A'
join ows.currency cu2 on cu2.code = d.trans_curr
and cu2.amnd_state = 'A'
join ows.sic s on s.code = d.sic_code
and s.amnd_state = 'A'
join ows.resp_code rc on d.return_code = rc.resp_code
and rc.amnd_state = 'A'
join ows.country co on co.code = d.trans_country
and co.name <> 'Kazakhstan'
and co.amnd_state = 'A'
left join ows.CREDIT_HISTORY ch on ch.doc__id = d.id
join ows.client_type ct on ct.id = cl.clt
and ct.amnd_state = 'A'
and ct.id in (6, 10)
left join ows.trans_type tt on d.trans_type = tt.id
and tt.amnd_state = 'A'
join ows.m_transaction mt on d.id = mt.doc__oid
and mt.posting_status = 'P'
and mt.id > 0
and mt.service_class = 'T'
left join ows.fx_rate fxr on mt.fx_seqv_n = fxr.seqv_n
and fxr.code = 840
left join ows.fx_rate fxeur on mt.fx_seqv_n = fxeur.seqv_n
and fxeur.code = 978
left join (select abs(den.AMOUNT) s,
d1.doc__prev__id d,
den.ACNT_CONTRACT__ID num
from ows.doc_entry_n den
join ows.doc d1 on den.DOC__OID = d1.id
and d1.amnd_state = 'A') p on p.num = ac.id
and p.d = d.id
where ac.amnd_state = 'A'
and ac.con_cat = 'C'
and (ac.service_group = '*' or '*' = '*')
order by 1



1. как было описано выше decode(d.is_authorization, 'Y'/*AUTH*/, d.trans_date, d.trans_date) можно менять на d.trans_date
2. в Way4 ac.contract_number без пробелов, его не надо trim-ить
3. это вообще странная конструкция and cl.clt in
4. попытка прикрутить индекс? and d.id > 0
5. зачем эта таблица прикручена? join ows.acnt_contract acc
6. в Way4 была функцайка перевода цифрового кода валюты в имя, а посему используйте его а не добавляйте 2 таблицы currency ... ну или перенесите в область select
7. зачем лезть в CREDIT_HISTORY и не использовать ответ?
8. попытка использования индекса? and mt.id > 0
9. попытка выключить индекс? and (ac.service_group = '*' or '*' = '*') - не пишите вообще

з.ы. проверьте поле fxr.code = 840 - оно точно number?
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698364
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686Щукина Анна,

В базе 100000 записей . Начальник говорит это долго. Можно объединить ли таблицы без join.

100к записей в таблице doc?

тогда добавьте hint LEADING(d) и/или FULL(d)
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698368
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686,

и and d.fx_settl_date > to_date('1990-01-01', 'yyyy-mm-dd') (по моей памяти) не пустое и это условие будет только мешать (тоже по памяти)
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698369
Erik1210198686
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Fxr.code тип number
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698380
Erik1210198686
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Как перенести в область select таблицу ows.corrency cu
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698381
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686MaximaXXL,

Fxr.code тип number

Ну и славненько, тогда выполните рекомендации описанные выше
И очень рекомендую hint-ы потому как этот селект должен выводить движения и подтягивать людей, а не наоборот

p.s. Когда надо что-то оптимизировать - добавляете пожалуйста план селекта, очень сложно без него понять
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698388
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686MaximaXXL,

Как перенести в область select таблицу ows.corrency cu

Ну как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select /*+LEADING(d)*/
...
(select cu.name from ows.currency cu where cu.code = ac.curr and cu.amnd_state = 'A')  as Валюта_конт,
...
from ...
--join ows.currency cu on cu.code = ac.curr
--and cu.amnd_state = 'A'
...
 
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698395
Erik1210198686
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,
Спасибо
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698409
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erik1210198686,

И напишите, плз, до скольки ускорился селект после проделанной работы? Да и новый селект можете прикрепить
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39698414
Erik1210198686
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Да хорошо
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39700321
ps -ef
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в КЗ со специалистами в банках все хуже и хуже :(
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39701082
Kamael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps -efв КЗ со специалистами в банках все хуже и хуже :(
Радует, что не все банки используют Way4
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39701379
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kamaelps -efв КЗ со специалистами в банках все хуже и хуже :(
Радует, что не все банки используют Way4

А что с ней не так?
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39701455
Kamael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkomyagkii_newbiKamaelпропущено...

Радует, что не все банки используют Way4

А что с ней не так?
Всё нормально с Way4. Контекст про КЗ, а в КЗ не у всех Way4.
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39701599
ps -ef
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kamael,

ну так "нет процессинга - нет Way4"
а без процессинга эт не банки, а шаражки :)
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39701786
Kamael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

ps -efKamael,
ну так "нет процессинга - нет Way4"
а без процессинга эт не банки, а шаражки :)

К солежению или к счастью, Way4 не единственное решение, которое может процессить.
...
Рейтинг: 0 / 0
Оптимизпция sql кода
    #39701857
ps -ef
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kamael,

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

вы точно мне отвечаете?
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизпция sql кода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]