Аналитические функции обычно работают лучше, чем объединения с select max, потому что в случае аналитической функции вы читаете одну и ту же таблицу только один раз, а вычисление row_number распределяется по секциям.
Попробуйте перегруппировать объединения и фильтрацию.
Соедините
LEFT OUTER JOIN (SELECT p_cd FROM T3 WHERE PV_TY_CD = 'ORIG_CD') PV
ON T1.TYP = PV.p_cd
, где условие ISNULL(PV.p_cd)
сокращает некоторые строки в T1.То же самое делают эти условия:
WHERE T1.state not in ("INVALID")
AND T1.evt_name NOT IN ('INACTIVE','DORMANT')
Переместите это объединение в подзапрос, если он фильтрует lo, это может помочь уменьшить набор данных в T1 до всех других объединений и row_number ():
(select T1.* from T1
left join (SELECT p_cd FROM T3 WHERE PV_TY_CD = 'ORIG_CD') PV
ON T1.TYP = PV.p_cd
where T1.state not in ("INVALID")
AND T1.evt_name NOT IN ('INACTIVE','DORMANT')
AND ISNULL(PV.p_cd)
) as T1
Кроме того, первый номер строки вычисляется только для таблиц T1 и B:
PARTITION BY T1.wtid, B.atid ORDER BY T1.b_ts DESC
Рассмотрите возможность объединения таблицы T5 после фильтра row_number, если это объединение имеет большой вес, а фильтр row_number уменьшает набор данных, затем переноситеrow_number с фильтром в подзапросе снова и присоединение к подзапросу, отфильтрованному с помощью T5.
(--filtered by row_number
select * from
(
SELECT T1.*, B.atid, B.a_id,
ROW_NUMBER() OVER (PARTITION BY T1.wtid, B.atid ORDER BY T1.b_ts DESC) AS RANK_
from
(select T1.* from T1
left join (SELECT p_cd FROM T3 WHERE PV_TY_CD = 'ORIG_CD') PV
ON T1.TYP = PV.p_cd
where T1.state not in ("INVALID")
AND T1.evt_name NOT IN ('INACTIVE','DORMANT')
AND ISNULL(PV.p_cd)
) as T1 JOIN T2 B ON T1.wtid = B.wtid and T1.b_ts = B.b_ts
) T WHERE T.rank_ = 1
) T --filtered
JOIN T5 ON T1.t_dt = T5.t_d
Это может помочь в зависимости от ваших данных.
Читайте также: https://stackoverflow.com/a/51061613/2700344 и это: https://stackoverflow.com/a/51061613/2700344