Proverei a riscrivere il CTE per rimuovere uno dei passaggi, ad es.
;cte as (
select a.first_num, a.second_num, a.first_num as first_key, 1 as sequence_count
from T_SEQ_FF a where not exists (select 1 from T_SEQ_FF b where a.first_num = b.second_num)
union all
select a.first_num, a.second_num, cte.first_key, cte.sequence_count + 1
from T_SEQ_FF a
inner join cte on a.first_num = cte.second_num
)
select *
from cte
option (maxrecursion 0);
Se è presente un solo elemento radice, sarebbe meglio passarlo nella query come variabile in modo che il valore possa essere utilizzato da Query Optimizer.
Un'altra cosa da provare è modificare la query per ottenere gli elementi radice senza una sottoquery, ad esempio second_num è null o first_num =second_num.