Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Оптимизпция sql кода / 25 сообщений из 30, страница 1 из 2
05.09.2018, 11:13
    #39698280
Erik1210198686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
Как можно оптимизировать этот код. Оно выполняеться 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
05.09.2018, 11:19
    #39698287
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
Код: 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
05.09.2018, 11:53
    #39698318
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
Отформатировал чтобы смотреть
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
05.09.2018, 11:57
    #39698322
Erik1210198686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
Vadim Lejnin,
Что за фильтрация
...
Рейтинг: 0 / 0
05.09.2018, 12:02
    #39698324
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
Erik1210198686,

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

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

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

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



Запрос на засыпку: что вернет это выражение? :)
...
Рейтинг: 0 / 0
05.09.2018, 12:13
    #39698350
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
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
05.09.2018, 12:24
    #39698364
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
Erik1210198686Щукина Анна,

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

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

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

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

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

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

Fxr.code тип number

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

p.s. Когда надо что-то оптимизировать - добавляете пожалуйста план селекта, очень сложно без него понять
...
Рейтинг: 0 / 0
05.09.2018, 12:44
    #39698388
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
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
05.09.2018, 12:48
    #39698395
Erik1210198686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
MaximaXXL,
Спасибо
...
Рейтинг: 0 / 0
05.09.2018, 13:07
    #39698409
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизпция sql кода
Erik1210198686,

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

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

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

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

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

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

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

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

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

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


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