powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
25 сообщений из 54, страница 2 из 3
Помогите оптимизировать запрос
    #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
25 сообщений из 54, страница 2 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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