Spróbowałbym przepisać CTE, aby usunąć jeden z kroków, tj.
;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);
Jeśli istnieje tylko jeden element główny, lepiej byłoby przekazać go do zapytania jako zmienną, aby wartość mogła być użyta przez optymalizator zapytania.
Inną rzeczą do wypróbowania jest zmiana zapytania, aby uzyskać elementy główne bez podzapytania, tj. second_num jest null lub first_num =second_num.