powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
54 сообщений из 54, показаны все 3 страниц
Помогите оптимизировать запрос
    #39565607
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Есть запрос для отчета сверки:
Код: 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.
select 
 a1.mag,
 sum(a1.prih_do)+sum(a1.vozv_do)-sum(a1.rash_do)-sum(a1.prod_do)-sum(a1.rash_vper)+sum(a1.prih_vper)-sum(a1.prod_vper)+sum(a1.vozv_vper) ostss
from
(select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_do,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.salesum,0)) else 0 end prod_vper3,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then  sum(decode(f.saletype,'CR',f.salesum,0)) else 0 end vozv_vper3
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom), f.saledate) a1
group by a1.mag


Суммирует себестоимость за месяц и остатки за весь период по магазинам 111,112,120,121,122
Выполняется полным сканированием таблицы.
Таблица supermag.ffmaprep гигов десять.
Запрос выполняется минут 10 (диски ssd)
Можно как-то с помощью аналитических функций или других способов оптимизировать запрос?
(Oracle 10g)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565658
lYY,

запрос у тебя линейный. там оптимизировать совершенно нечего. тут, скорее, подход к получению нужных данных надо менять, а не запрос оптимизировать...
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565670
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYYпо магазинам 111,112,120,121,122Какой это процент от всех данных?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565671
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхlYY,

запрос у тебя линейный. там оптимизировать совершенно нечего. тут, скорее, подход к получению нужных данных надо менять, а не запрос оптимизировать...Ну если он уходит в темп, то оптимизировать есть чего.
10 гигов за 10 минут на SSD это что-то не вполне адекватное.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565673
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
EliclYYпо магазинам 111,112,120,121,122Какой это процент от всех данных?
там может быть любой список магазинов
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565678
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
dbms_photoshop10 гигов за 10 минут на SSD это что-то не вполне адекватное.
да, странно это
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565683
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Добрый Э - ЭхlYY,

запрос у тебя линейный. там оптимизировать совершенно нечего. тут, скорее, подход к получению нужных данных надо менять, а не запрос оптимизировать...
Тут как обычно всё. Разработчики написали эту хрень, которая забивает весь ввод-вывод и им плевать. А с меня пользователи спрашивают, почему сервер тормозит?!
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565693
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы предложил агрегировать данные на ежемесячной основе.
Затем уже выбирать из этих данных необходимые + месяц из supermag.ffmaprep

З.Ы.
Код: plsql
1.
f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY')


=
Код: plsql
1.
2.
f.saledate >= to_date('01.11.2017','DD.MM.YYYY')
where f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565699
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

смотреть индексы какие есть, мож придется декоде переписать

или скажем для
'WI','CS','CR' тож раз посчитать на начало года

нет f.saledate>= поетому беда

.....
stax
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565701
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Dshedoo,

подумаем.

Уточнил объем таблицы, 48 Гб, 275 миллионов строк.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565705
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
индексы
Код: plsql
1.
2.
3.
4.
5.
6.
create index SUPERMAG.FFMAPREP_ARTICLE on SUPERMAG.FFMAPREP (ARTICLE)
create index SUPERMAG.FFMAPREP_DOC on SUPERMAG.FFMAPREP (SALEID, SALETYPE, SALESPECITEM)
create index SUPERMAG.FFMAPREP_LOCFROM on SUPERMAG.FFMAPREP (SALELOCATIONFROM, SALEDATE)
create index SUPERMAG.FFMAPREP_LOCTO on SUPERMAG.FFMAPREP (SALELOCATIONTO, SALEDATE)
create index SUPERMAG.FFMAPREP_SALEDATE on SUPERMAG.FFMAPREP (SALEDATE)
create index SUPERMAG.FFMAPREP_SUPPLIER on SUPERMAG.FFMAPREP (INCOMECLIENTINDEX)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565723
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYYиндексы
Код: plsql
1.
2.
3.
4.
5.
6.
create index SUPERMAG.FFMAPREP_ARTICLE on SUPERMAG.FFMAPREP (ARTICLE)
create index SUPERMAG.FFMAPREP_DOC on SUPERMAG.FFMAPREP (SALEID, SALETYPE, SALESPECITEM)
create index SUPERMAG.FFMAPREP_LOCFROM on SUPERMAG.FFMAPREP (SALELOCATIONFROM, SALEDATE)
create index SUPERMAG.FFMAPREP_LOCTO on SUPERMAG.FFMAPREP (SALELOCATIONTO, SALEDATE)
create index SUPERMAG.FFMAPREP_SALEDATE on SUPERMAG.FFMAPREP (SALEDATE)
create index SUPERMAG.FFMAPREP_SUPPLIER on SUPERMAG.FFMAPREP (INCOMECLIENTINDEX)



убрать decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)

считать отдельно для f.salelocationfrom=-2 in f.salelocationto (...
union all
f.salelocationfrom<>-2 in f.salelocationfrom (...


ps
автор BETWEEN

Оптимизатор всегда заменяет условие, использующее оператор
сравнения BETWEEN, эквивалентным условием, использующим
операторы сравнения <= и >=. Например, оптимизатор заменяет
первое из двух следующих условий на второе:

sal BETWEEN 2000 AND 3000

sal >= 2000 AND sal <= 3000


.....
stax
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565732
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYYdbms_photoshop10 гигов за 10 минут на SSD это что-то не вполне адекватное.
да, странно этоВерсия какая?
Приложи в спойлер вывод
Код: plaintext
select dbms_sqltune.report_sql_monitor('твой SQL ID') from dual
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565748
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
select 
 a1.mag,
 sum(a1.prih_do+a1.vozv_do-a1.rash_do-a1.prod_do-a1.rash_vper+a1.prih_vper-a1.prod_vper+a1.vozv_vper) ostss
from
(select 
  case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end mag,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then sum(f.primecost) else 0 end rash_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then sum(f.primecost) else 0 end prih_do,   
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then sum(f.primecost) else 0 end prod_do,   
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then sum(f.primecost) else 0 end vozv_do,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then sum(f.primecost) else 0 end rash_vper,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then sum(f.primecost) else 0 end prih_vper,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then sum(f.primecost) else 0 end prod_vper,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then sum(f.primecost) else 0 end vozv_vper,    
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then sum(f.salesum) else 0 end prod_vper3,   
  case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then sum(f.salesum) else 0 end vozv_vper3    
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and --case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end in (111,112,120,121,122)
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom != -2 and f.salelocationfrom in (111,112,120,121,122))
      )
      
group by case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end, f.saledate) a1
group by a1.mag
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565771
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: plsql
1.
2.
3.
4.
5.
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom != -2 and f.salelocationfrom in (111,112,120,121,122))
      )



Dshedoo
Код: plsql
1.
2.
3.
4.
5.
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565810
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooDshedoo
Код: plsql
1.
2.
3.
4.
5.
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )



імхо плохо
f.salelocationfrom = -2 f.salelocationto = 999 f.salelocationfrom =111


ps
оракля юзает ф-цію
LNNVL(f.salelocationfrom = -2) and

....
stax
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565837
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

Я сейчас что-то набросаю, но вот вопрос, А зачем делать group by по f.saledate если больше его не использовать?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565846
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: 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.
select 
 a1.mag,
 sum(a1.prih_do+a1.vozv_do-a1.rash_do-a1.prod_do-a1.rash_vper+a1.prih_vper-a1.prod_vper+a1.vozv_vper) ostss
from
(select 
  case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end mag,
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then f.primecost else 0 end) rash_do,
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then f.primecost else 0 end) prih_do,   
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then f.primecost else 0 end) prod_do,   
  sum(case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then f.primecost else 0 end) vozv_do,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WO'
    then f.primecost else 0 end) rash_vper,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'WI'
    then f.primecost else 0 end) prih_vper,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then f.primecost else 0 end) prod_vper,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then f.primecost else 0 end) vozv_vper,    
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CS'
    then f.salesum else 0 end) prod_vper3,   
  sum(case when f.saledate >= to_date('01.11.2017','DD.MM.YYYY') and f.saletype = 'CR'
    then f.salesum else 0 end) vozv_vper3    
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and 
--
--1)
    case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end in (111,112,120,121,122)
--2)
     (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
--
group by case when f.salelocationfrom = -2 then f.salelocationto else f.salelocationfrom end) a1
group by a1.mag



Так лучше?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565865
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

По быстрому получилось что-то такое:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum( case f.saletype when 'WO' then -1*f.primecost /*-1 rash_do_vper,*/
                       when 'WI' then    f.primecost /*+1 prih_do_vper,*/
                       when 'CS' then -1*f.primecost /*-1 prod_do_vper,*/
                       when 'CR' then    f.primecost /*+1 vozv_do_vper,*/
                       else 0 end 
                       ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
      (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



Хотя и не проверял =)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565887
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXLlYY,

Я сейчас что-то набросаю, но вот вопрос, А зачем делать group by по f.saledate если больше его не использовать?
это не я писал, я админ просто)

Всем спасибо, я позже протестирую и по результатам отпишусь.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565913
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

Else 0 подменить на where f.saletype in ('WO','WI','CS','CR')

А так прям перфекто)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565918
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Взял исходный запрос на один магазин - 2 минуты, полное сканирование.
Сделал через union all, как выше посоветовали. Идет по индексам, выполняется 2 секунды.
Отправил разработчикам, путь тестируют.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565923
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXLlYY,

По быстрому получилось что-то такое:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum( case f.saletype when 'WO' then -1*f.primecost /*-1 rash_do_vper,*/
                       when 'WI' then    f.primecost /*+1 prih_do_vper,*/
                       when 'CS' then -1*f.primecost /*-1 prod_do_vper,*/
                       when 'CR' then    f.primecost /*+1 vozv_do_vper,*/
                       else 0 end 
                       ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
      (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



Хотя и не проверял =)

Не проходит вот эта строка:
Код: plsql
1.
(f.salelocationfrom = -2 and f.salelocationto in (120))
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565932
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
вот так работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum( case f.saletype when 'WO' then -1*f.primecost /*-1 rash_do_vper,*/
                       when 'WI' then    f.primecost /*+1 prih_do_vper,*/
                       when 'CS' then -1*f.primecost /*-1 prod_do_vper,*/
                       when 'CR' then    f.primecost /*+1 vozv_do_vper,*/
                       else 0 end 
                       ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
 and
      (
      (f.salelocationfrom = -2 and f.salelocationto in (120))
     or
      (f.salelocationfrom in (120))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)


но дольше, 86 секунд, идет bitmap convertion
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565933
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Там есть куда руки приложить ...
else 0 можно игнорить ... все равно null под суммой будет проигнорирован.
если добавлять
f.saletype in ('WO','WI','CS','CR')

то тогда уже так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
      (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



Хотя так я бы прокоментировал что хотел сказать автор
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565946
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

разберите на union ... ктож знает Ваши индексы

Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (111,112,120,121,122)

union all

select 
  f.salelocationfrom mag,
  decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (111,112,120,121,122)
) a1
group by a1.mag
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565947
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXLDshedoo,

Там есть куда руки приложить ...
else 0 можно игнорить ... все равно null под суммой будет проигнорирован.
если добавлять
f.saletype in ('WO','WI','CS','CR')

то тогда уже так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 /*and decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122)*/
      (
      (f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122))
     or
      (f.salelocationfrom in (111,112,120,121,122))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



Хотя так я бы прокоментировал что хотел сказать автор
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and 
      (
      (f.salelocationfrom = -2 and f.salelocationto in (120))
     or
      (f.salelocationfrom in (120))
      )
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)


результат запроса правильный, выполнялся 87 сек
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565970
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXL
Получилась, конечно, красота. Круто!
Но время выполнения 68 сек
1.
запрос
Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (120)

union all

select 
  f.salelocationfrom mag,
  decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost ostss

from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (120)
) a1
group by a1.mag


план:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
PLAN
--------------------------------------------------------------------------------
SELECT STATEMENT
  HASH  GROUP BY
    VIEW
      UNION-ALL
        TABLE ACCESS  BY INDEX ROWID  FFMAPREP
          BITMAP CONVERSION  TO ROWIDS
            BITMAP AND
              BITMAP CONVERSION  FROM ROWIDS
                SORT  ORDER BY
                  INDEX  RANGE SCAN  FFMAPREP_LOCFROM
              BITMAP CONVERSION  FROM ROWIDS
                SORT  ORDER BY
                  INDEX  RANGE SCAN  FFMAPREP_LOCTO
        TABLE ACCESS  BY INDEX ROWID  FFMAPREP
          INDEX  RANGE SCAN  FFMAPREP_LOCFROM



тогда как
запрос
Код: 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.
select 
 a1.mag,
 sum(a1.prih_do)+sum(a1.vozv_do)-sum(a1.rash_do)-sum(a1.prod_do)-sum(a1.rash_vper)+sum(a1.prih_vper)-sum(a1.prod_vper)+sum(a1.vozv_vper) ostss
from
(
select 
  f.salelocationfrom mag,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_do,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.salesum,0)) else 0 end prod_vper3,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then  sum(decode(f.saletype,'CR',f.salesum,0)) else 0 end vozv_vper3
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.salelocationfrom in (120)
group by f.salelocationfrom, f.saledate

union all

select 
  f.salelocationto mag,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_do,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_vper,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.salesum,0)) else 0 end prod_vper3,
  case when f.saledate between to_date('01.11.2017','DD.MM.YYYY') and to_date('30.11.2017','DD.MM.YYYY') 
  then  sum(decode(f.saletype,'CR',f.salesum,0)) else 0 end vozv_vper3
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.salelocationto in (120)
group by f.salelocationto, f.saledate

) a1
group by a1.mag


выполняется за 13 сек
план:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
PLAN
--------------------------------------------------------------------------------
SELECT STATEMENT
  HASH  GROUP BY
    VIEW
      UNION-ALL
        SORT  GROUP BY NOSORT
          TABLE ACCESS  BY INDEX ROWID  FFMAPREP
            INDEX  RANGE SCAN  FFMAPREP_LOCFROM
        SORT  GROUP BY NOSORT
          TABLE ACCESS  BY INDEX ROWID  FFMAPREP
            INDEX  RANGE SCAN  FFMAPREP_LOCTO

...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565983
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

Потому что второй запрос не соответствует первоначальному условию:
пропущен and f.salelocationfrom = -2
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565986
lYY,
Попробуй-ка так:
Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (111,112,120,121,122)
group by   f.salelocationto, f.saledate
union all

select 
  f.salelocationfrom mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (111,112,120,121,122)
group by f.salelocationfrom, f.saledate
) a1
group by a1.mag
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39565993
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXLlYY,

Потому что второй запрос не соответствует первоначальному условию:
пропущен and f.salelocationfrom = -2
Точно, это моя ошибка)

Еще раз спасибо всем за помощь!

ЗЫ: Разработчики озадачены, админы пьют пиво))
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566003
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повелитель индексов,

Группировку по f.saledate надо выкинуть:

Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (111,112,120,121,122)
group by   f.salelocationto
union all

select 
  f.salelocationfrom mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (111,112,120,121,122)
group by f.salelocationfrom
) a1
group by a1.mag



lYY,

или так:

Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
    sum( case when f.saletype in ('WO', 'CS') then -1*f.primecost /*-1 rash_do_vper, prod_do_vper*/
              when f.saletype in ('WI', 'CR')  then    f.primecost /*+1 prih_do_vper, vozv_do_vper*/
              else 0 end ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
-- and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (111,112,120,121,122)
group by   f.salelocationto

union all

select 
  f.salelocationfrom mag,
    sum( case when f.saletype in ('WO', 'CS') then -1*f.primecost /*-1 rash_do_vper, prod_do_vper*/
              when f.saletype in ('WI', 'CR')  then    f.primecost /*+1 prih_do_vper, vozv_do_vper*/
              else 0 end ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
-- and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (111,112,120,121,122)
group by f.salelocationfrom
) a1
group by a1.mag

...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566004
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Повелитель индексов,
Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (120)
group by   f.salelocationto, f.saledate
union all
select 
  f.salelocationfrom mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (120)
group by f.salelocationfrom, f.saledate
) a1
group by a1.mag



47 сек

Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
-- and f.salelocationfrom = -2 
 and f.salelocationto in (120)
group by   f.salelocationto, f.saledate
union all
select 
  f.salelocationfrom mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (120)
group by f.salelocationfrom, f.saledate
) a1
group by a1.mag


2 сек

Надо разобраться, так ли нужно условие:
and f.salelocationfrom = -2
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566008
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXL,

Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
    sum( case when f.saletype in ('WO', 'CS') then -1*f.primecost /*-1 rash_do_vper, prod_do_vper*/
              when f.saletype in ('WI', 'CR')  then    f.primecost /*+1 prih_do_vper, vozv_do_vper*/
              else 0 end ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.salelocationfrom = -2 
 and f.salelocationto in (120)
group by   f.salelocationto
union all
select 
  f.salelocationfrom mag,
    sum( case when f.saletype in ('WO', 'CS') then -1*f.primecost /*-1 rash_do_vper, prod_do_vper*/
              when f.saletype in ('WI', 'CR')  then    f.primecost /*+1 prih_do_vper, vozv_do_vper*/
              else 0 end ) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.salelocationfrom in (120)
group by f.salelocationfrom
) a1
group by a1.mag


67 сек
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566014
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

А этот вариант?

Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (111,112,120,121,122)
group by   f.salelocationto
union all

select 
  f.salelocationfrom mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (111,112,120,121,122)
group by f.salelocationfrom
) a1
group by a1.mag

...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566018
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,
Так:?
Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from (select * from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 )
 where f.salelocationto in (120)
group by   f.salelocationto, f.saledate
union all
select 
  f.salelocationfrom mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (120)
group by f.salelocationfrom, f.saledate
) a1
group by a1.mag
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566023
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXLlYY,

А этот вариант?

Код: 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.
select mag, sum(ostss) ostss
from (
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 
 and f.salelocationto in (111,112,120,121,122)
group by   f.salelocationto
union all

select 
  f.salelocationfrom mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom in (111,112,120,121,122)
group by f.salelocationfrom
) a1
group by a1.mag


59 сек
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566026
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

по одному магу 47 сек по всем 59 ... как по мне - ускорился в 10 раз
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566027
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

И снял нагрузку на базу
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566034
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
MaximaXXLlYY,

по одному магу 47 сек по всем 59 ... как по мне - ускорился в 10 раз
да по одному магазину я все запросы тестирую)))
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566080
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,

Тогда странно, запрос с ненужным f.saledate предложенный "Повелитель индексов" отработал 47 сек, а с выкинутым из запроса f.saledate - 59 сек
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566123
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
сейчас еще раз попробовал, но на 5 магазинов:
исходный 212 сек
через union 192 сек
через union без saledate 165 сек
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566138
lYY[
Но время выполнения 68 сек
...
BITMAP CONVERSION TO ROWIDS
...
тогда как
запросотключи битмап конвертацию на уровне сессии и посмотри чего будет со временем исполнения...
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566496
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхlYY[
Но время выполнения 68 сек
...
BITMAP CONVERSION TO ROWIDS
...
тогда как
запросотключи битмап конвертацию на уровне сессии и посмотри чего будет со временем исполнения...

А если мы будем использовать вложенный селект?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
  f.salelocationto mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*f.primecost) ostss
from (select * from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom = -2 )
 where f.salelocationto in (120)
group by   f.salelocationto, f.saledate
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566626
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYYсейчас еще раз попробовал, но на 5 магазинов:
исходный 212 сек
через union 192 сек
через union без saledate 165 сек

212с, ето 3,5 минуты для МЕСЯЧНОГО отчета, не партесь, подождут

зы
авторЗапрос выполняется минут 10 (диски ssd)


.....
stax
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39566680
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Тогда лучше так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*
   case when f.salelocationfrom != -2 then f.primecost
        when f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122) then f.primecost
        else 0 end) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom  (-2, 111,112,120,121,122)
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)



или так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
  decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) mag,
  sum(decode(f.saletype, 'WO', -1, 'CS', -1 , 1)*
   case when decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122) then f.primecost
          else 0 end) ostss
from supermag.ffmaprep f
where f.rectype=1
 and f.saledate<=to_date('30.11.2017','DD.MM.YYYY')
 and f.saletype in ('WO','WI','CS','CR')
 and f.salelocationfrom  (-2,111,112,120,121,122)
group by decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39567479
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL
Код: plsql
1.
        f.salelocationfrom = -2 and f.salelocationto in (111,112,120,121,122) 


Код: plsql
1.
       decode(f.salelocationfrom,-2,f.salelocationto,f.salelocationfrom) in (111,112,120,121,122) 



Тут оракл побежит по 2 индексам.
Из-за этого 1 запрос отрабатывает 2 секунды, а другой 67.

Не уверен, что оракл не станет "оптимизировать" вложенный селект, но, думаю, попробовать стоит.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39568069
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,
ограничение снизу сделайте. т.е. диапазон.
Смысл условия ?
Код: plsql
1.
f.saledate<=to_date('30.11.2017','DD.MM.YYYY')


наример
Код: plsql
1.
TRUNC(f.saledate,'YY') BETWEEN BETWEEN TRUNC(:P1,'YY') AND TRUNC(SYSDATE,'YY')


Где :p1 нижний предел даты.

Выборка на 10 гигах, подозреваю, должна отрабатыввать в долях секунды.

lYYСуммирует себестоимость за месяц и остатки за весь период по магазинам 111,112,120,121,122
соответственно посмотреть на
Код: plsql
1.
SUM() OVER(PARTITION BY....


т.е. Аналитические функции
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39568070
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
условие
Код: plsql
1.
f.saledate<=to_date('30.11.2017','DD.MM.YYYY')


фактически говорит "выбрать все записи".
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39568152
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2условие
Код: plsql
1.
f.saledate<=to_date('30.11.2017','DD.MM.YYYY')


фактически говорит "выбрать все записи".

для некоторых кодов ему и надо "выбрать все записи"
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WO',f.primecost,0)) else 0 end rash_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'WI',f.primecost,0)) else 0 end prih_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CS',f.primecost,0)) else 0 end prod_do,
  case when f.saledate<to_date('01.11.2017','DD.MM.YYYY') then
   sum(decode(f.saletype,'CR',f.primecost,0)) else 0 end vozv_do,



......
stax
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39568336
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooЯ бы предложил агрегировать данные на ежемесячной основе.
Затем уже выбирать из этих данных необходимые + месяц из supermag.ffmaprep

Так же думаю, например, матвьюшка до текущего месяца с уже агрегированными данными.
вторая или обычная вьюшка - текущий месяц, так же уже агрегированные данные.
Впрочем, и с живой таблицей за текущий месяц наверно не накладно будет работать.

Если нужен срез за прошедший период - достаточно одной матвьюшки.

так.. размышления :)

Посмотрел план исходного запроса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select 
 a1.mag,
 sum(a1.prih_do)+sum(a1.vozv_do)-sum(a1.rash_do)-sum(a1.prod_do)-sum(a1.rash_vper)+sum(a1.prih_vper)-sum(a1.prod_vper)+sum(a1.vozv_vper) ostss
from
(SELECT DECODE(F.SALELOCATIONFROM, -2, F.SALELOCATIONTO, F.SALELOCATIONFROM) MAG,
        CASE WHEN F.SALEDATE < TO_DATE('01.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'WO', F.PRIMECOST, 0)) ELSE 0 END RASH_DO,
        CASE WHEN F.SALEDATE < TO_DATE('01.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'WI', F.PRIMECOST, 0)) ELSE 0 END PRIH_DO,
        CASE WHEN F.SALEDATE < TO_DATE('01.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CS', F.PRIMECOST, 0)) ELSE 0 END PROD_DO,
        CASE WHEN F.SALEDATE < TO_DATE('01.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CR', F.PRIMECOST, 0)) ELSE 0 END VOZV_DO,
        CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'WO', F.PRIMECOST, 0)) ELSE 0 END RASH_VPER,
        CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'WI', F.PRIMECOST, 0)) ELSE 0 END PRIH_VPER,
        CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CS', F.PRIMECOST, 0)) ELSE 0 END PROD_VPER,
        CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CR', F.PRIMECOST, 0)) ELSE 0 END VOZV_VPER,
        CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CS', F.SALESUM, 0)) ELSE 0 END PROD_VPER3,
        CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CR', F.SALESUM, 0)) ELSE 0 END VOZV_VPER3
FROM FFMAPREP F
WHERE F.RECTYPE = 1
AND F.SALEDATE <= TO_DATE('30.11.2017', 'DD.MM.YYYY')
AND DECODE(F.SALELOCATIONFROM, -2, F.SALELOCATIONTO, F.SALELOCATIONFROM) IN (111, 112, 120, 121, 122)
GROUP BY DECODE(F.SALELOCATIONFROM, -2, F.SALELOCATIONTO, F.SALELOCATIONFROM), F.SALEDATE
) a1
group by a1.mag;



В общем, ничем не хуже предложенных ;)
Вероятно, дело в индексах которые уже есть. Если оставить только idx_SALEDATE - будет наверно заметно быстрее.
Может перестроить их или еще что, думаю они тут тормозят.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39568340
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и да
Код: plsql
1.
2.
CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CS', F.SALESUM, 0)) ELSE 0 END PROD_VPER3,
CASE WHEN F.SALEDATE BETWEEN TO_DATE('01.11.2017', 'DD.MM.YYYY') AND TO_DATE('30.11.2017', 'DD.MM.YYYY') THEN SUM(DECODE(F.SALETYPE, 'CR', F.SALESUM, 0)) ELSE 0 END VOZV_VPER3


Не используются.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39568354
один сум
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем глубокий смысл считать последний месяц отдельными полями, чтобы потом все равно складывать вместе. saletype туда же.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #39568366
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
один сумА в чем глубокий смысл считать последний месяц отдельными полями, чтобы потом все равно складывать вместе. saletype туда же.
Может:
пришло до, ушло до, было до, расход после, приход после, остаток после
исходя из этого и вычисления разные. :)
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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