SAP HANA |С выполнением пункта - PullRequest
0 голосов
/ 18 мая 2018

Мы используем SAP HANA 1.0 SPS12.

У нас есть дневная таблица, как показано ниже -

выберите trans_date, article, measure1, measure2 из table_1

объем таблицы ~5 миллионов строк

нам нужно увидеть такие данные, как -

select 'day-1',sum(measure1),sum(meaure2) from table1 where trans_date=add_days(current_date,-1) group by 'day-1'
union all
select 'day-2',sum(measure1),sum(meaure2) from table1 where trans_date>=add_days(current_date,-2) group by 'day-2' 
union all
select 'WTD',sum(measure1),sum(meaure2) from table1 where trans_date>=add_days(current_date,-7) group by 'WTD'
union all
select 'WTD-1',sum(measure1),sum(meaure2) from table1 where trans_date>=add_days(current_date,-15) and trans_Date <= add_days(current_date,-7) group by 'WTD-1'

и т. Д. Для MTD, MTD-1, MTD-2, YTD.

Производительностьлучше ли использовать WITH CLAUSE и хранить данные в течение одного года, а затем разбивать их в соответствии с временными рамками?ИЛИ Лучше ли использовать отдельное агрегирование для каждого таймфрейма, как показано выше.

Насколько я понимаю, в СУБД, таких как Oracle, WITH CLAUSE материализует результаты и использует их из памяти.SAP HANA - это сама база данных In Memory.Дает ли использование WITH CLAUSE в SAP HANA отличительное преимущество в производительности?

Запрос с использованием WITH CLAUSE -

WITH t1 as
(
select trans_date,sum(measure1),sum(meaure2) from table1 where trans_date>=add_days(current_date,-365)
)
select 'day-1',sum(measure1),sum(meaure2) from t1 where trans_date=add_days(current_date,-1) group by 'day-1'
union all
select 'day-2',sum(measure1),sum(meaure2) from t1 where trans_date>=add_days(current_date,-2) group by 'day-2' 
union all
select 'WTD',sum(measure1),sum(meaure2) from t1 where trans_date>=add_days(current_date,-7) group by 'WTD'
union all
select 'WTD-1',sum(measure1),sum(meaure2) from t1 where trans_date>=add_days(current_date,-15) 
                                                  and trans_Date <= add_days(current_date,-7) 
                                                  group by 'WTD-1'

1 Ответ

0 голосов
/ 18 мая 2018

Если вы заботитесь о производительности, размещение данных в одной строке должно быть намного лучше:

select sum(case when trans_date = add_days(current_date, -1) then measure1 end) as measure1_day1,
       sum(case when trans_date = add_days(current_date, -1) then measure2 end) as measure2_day1,
       sum(case when trans_date = add_days(current_date, -2) then measure1 end) as measure1_day2,
       sum(case when trans_date = add_days(current_date, -2) then measure2 end) as measure2_day2,
       . . .       
from table1
where trans_date >= add_days(current_date, -15);

Вы можете отменить результаты после этого, если вам действительно нужны значения в отдельных строках.

В качестве альтернативы вы можете сделать:

select days, sum(measure1), sum(measure2)
from (select 1 as days from dummy union all
      select 2 from dummy union all
      select 7 from dummy union all
      select 15 from dummy
     ) d left join
     table1 t
     on t.trans_date = add_days(current_date, - d.days)
group by days
order by days;
...