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


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