Db2 отсортирует данные только один раз, если все функции OLAP используют одинаковые PARTITION BY
и ORDER BY
.Вы можете подтвердить это, посмотрев план объяснения.
create table data(v1 int, v2 int, v3 int, g1 int, g2 int, o1 int, o2 int) organize by row
;
explain plan for
select g1
, g2
, o1
, o2
, v1
, v2
, v3
, lag(v1) over(partition by g1, g2 order by o1, o2 ) as lag_v1
, lag(v2) over(partition by g1, g2 order by o1, o2 ) as lag_v2
, lag(v3) over(partition by g1, g2 order by o1, o2 ) as lag_v3
from
data
;
даст следующий план (используя db2exfmt -1 -d $DATABASE
).Вы можете видеть, что есть только один SORT
оператор
Access Plan:
-----------
Total Cost: 14.839
Query Degree: 4
Rows
RETURN
( 1)
Cost
I/O
|
1000
LMTQ
( 2)
14.839
2
|
1000
TBSCAN
( 3)
14.5555
2
|
1000
SORT
( 4)
14.5554
2
|
1000
TBSCAN
( 5)
14.2588
2
|
1000
TABLE: PAUL
DATA
Q1
Кстати, если вы отправите вопрос с реальным запросом SQL (вместе с некоторым DDL и некоторым представлением об объемах данных), мы могли быпредложить вещи, которые могут улучшить производительность получения отстающих значений.Трудно советовать подробно, не видя лучшего примера